¿Cómo obtener la cantidad de elementos posibles de un Enum?

3 minutos de lectura

Avatar de usuario de AdrianKhisbe
AdrianKhisbe

¿Existe una forma integrada de obtener la cantidad de elementos de un Enum con algo como Myenum.length,

¿O tengo que implementarme una función? int size() grabar el número de elemento?

  • ¿Estás hablando de enumeraciones o una Enumeración? Estos no son lo mismo.

    – Cyrille Ka

    5 de julio de 2013 a las 15:14


  • Estaba hablando de enumeraciones. El problema es que en las enumeraciones francesas es una abreviatura de “enumeración” (como en inglés, tiendo a pensar). así que no estaba hablando de la interfaz.

    – AdrianKhisbe

    5 de julio de 2013 a las 15:27

  • ¿Está bien que agregué la etiqueta Kotlin? Busqué en Google una solución de Kotlin y terminé aquí.

    – Mahozad

    27 de septiembre de 2021 a las 8:19

  • Consulte esta publicación relacionada.

    – Mahozad

    27 de septiembre de 2021 a las 8:23

  • Ver también este problema de seguimiento que propone un reemplazo eficaz para Enum.values() en Kotiln.

    – Mahozad

    6 de noviembre de 2021 a las 12:10

Avatar de usuario de Hunter McMillen
cazador mcmillen

Sí, puedes usar el Enum.values() método para obtener una matriz de valores de Enum y luego use el length propiedad.

public class Main {
    enum WORKDAYS { Monday, Tuesday, Wednesday, Thursday, Friday; }

    public static void main(String[] args) {
        System.out.println(WORKDAYS.values().length);
        // prints 5
    }
}

http://ideone.com/zMB6pG

  • Enum.values() asigna una nueva matriz cada vez, por lo que no se recomienda para una alta tasa de llamadas (es decir, condición de bucle for). Almacene en caché el valor si necesita llamarlo con mucha frecuencia.

    – Marcos Jerónimo

    21 de octubre de 2019 a las 13:46


  • @MarkJeronimus Incluso sin llamarlo a menudo, sigue siendo una mala práctica. Asignar una matriz solo para la propiedad de longitud es una tontería, incluso si solo se hace una vez.

    – Demonio del odio

    4 de febrero de 2021 a las 8:35

  • @Hatefiend, entonces, ¿qué sugieres?

    – Bouh

    5 mayo 2021 a las 23:42

Avatar de usuario de Rahul Bobhate
Raúl Bobhate

Puedes obtener la longitud usando Myenum.values().length

El Enum.values() devuelve una matriz de todos los enum constantes Puedes usar el length variable de esta matriz para obtener el número de enum constantes

Suponiendo que tiene la siguiente enumeración:

public enum Color
{
    BLACK,WHITE,BLUE,GREEN,RED
}

La siguiente declaración asignará 5 a size:

int size = Color.values().length;

  • length no es un método de una matriz, es un campo de propiedad, por lo que lo usaría sin paréntesis.

    – Cyrille Ka

    5 de julio de 2013 a las 15:18


  • @CyrilleKa: Gracias por avisar. corregido 🙂

    – Raúl Bobhate

    5 de julio de 2013 a las 15:22

Avatar de usuario de Yevhen Tkachenko
Yevhen Tkachenko

Para evitar llamar valores() método cada vez:

public class EnumTest {

    enum WORKDAYS {
       Monday,
       Tuesday,
       Wednesday,
       Thursday,
       Friday;

       public static final int size;
       static {
          size = values().length;
       }
   }


   public static void main(String[] args) {
      System.out.println(WORKDAYS.size); // 5
   }
}

avatar de usuario de jaamit
jaamit

El compilador de Java agrega el método enum.values() y no se menciona en las API.

¿Dónde está la documentación para el método de valores () de Enum?

MyEnum.values() devuelve las constantes de enumeración como una matriz.

Entonces puedes usar:

int size = MyEnum.values().length

Busqué una respuesta de Kotlin y apareció esta pregunta. Entonces, aquí está mi respuesta.

enum class MyEnum { RED, GREEN, BLUE }
MyEnum.values().size // 3

Esta es otra forma de hacerlo:

inline fun <reified T : Enum<T>> sizeOf() = enumValues<T>().size
sizeOf<MyEnum>() // 3

Gracias a Miha_x64 por esta respuesta.

avatar de usuario de nix
nada

En respuesta a la respuesta de Yevhen Tkachenko, se puede optimizar aún más cuando se usa la matriz de valores de enumeración, por lo que el compilador llama values() solo una vez:

public class EnumTest {

    enum WORKDAYS {
       Monday,
       Tuesday,
       Wednesday,
       Thursday,
       Friday;

       public static final WORKDAYS[] values = WORKDAYS.values();
   }

   public static void main(String[] args) {
      System.out.println(WORKDAYS.values.length); // 5
      for (int i = 0; i < WORKDAYS.values.length; i++)
         System.out.println(WORKDAYS.values[i].name());
   }
}

¿Ha sido útil esta solución?