Enumeración de Java (enum)

La enumeración de Java es una clase especial que generalmente representa un grupo de constantes, como las 4 estaciones del año, los 12 meses del año, los 7 días de la semana, y las direcciones (este, sur, oeste, norte), etc.

La clase enum de Java se define con la palabra clave enum, y las constantes usan comas,para separarse.

Por ejemplo, defina una clase enum de colores.

enum Color 
{ 
    RED, GREEN, BLUE; 
} 

La clase enum Color anterior tiene las constantes de color RED, GREEN y BLUE, que representan el rojo, el verde y el azul, respectivamente.

Ejemplo de uso:

Ejemplo

enum Color
{
    RED, GREEN, BLUE;
}
 
public class Test
{
    // Salida al ejecutar
    public static void main(String[] args)
    {
        Color c1 = Color.RED;
        System.out.println(c1);
    }
}

El resultado de ejecutar el código anterior es:

RED

Uso de enumeraciones en clases internas

La clase enum también se puede declarar dentro de una clase interna:

Ejemplo

public class Test
{
    enum Color
    {
        RED, GREEN, BLUE;
    }
 
    // Salida al ejecutar
    public static void main(String[] args)
    {
        Color c1 = Color.RED;
        System.out.println(c1);
    }
}

El resultado de ejecutar el código anterior es:

RED

Cada enumeración se implementa internamente mediante Class, y todos los valores de enumeración son public static final.

La clase enum Color anterior se convierte en una implementación de clase interna:

class Color
{
     public static final Color RED = new Color();
     public static final Color BLUE = new Color();
     public static final Color GREEN = new Color();
}

Iterar los elementos de la enumeración

Se puede usar una sentencia for para iterar los elementos de la enumeración:

Ejemplo

enum Color
{
    RED, GREEN, BLUE;
}
public class MyClass {
  public static void main(String[] args) {
    for (Color myVar : Color.values()) {
      System.out.println(myVar);
    }
  }
}

El resultado de ejecutar el código anterior es:

RED
GREEN
BLUE

Uso de la clase enum en switch

La clase enum se usa a menudo en sentencias switch:

Ejemplo

enum Color
{
    RED, GREEN, BLUE;
}
public class MyClass {
  public static void main(String[] args) {
    Color myVar = Color.BLUE;

    switch(myVar) {
      case RED:
        System.out.println("rojo");
        break;
      case GREEN:
         System.out.println("verde");
        break;
      case BLUE:
        System.out.println("azul");
        break;
    }
  }
}

El resultado de ejecutar el código anterior es:

azul

Métodos values(), ordinal() y valueOf()

La clase de enumeración definida con enum hereda por defecto de la clase java.lang.Enum e implementa las interfaces java.lang.Serializable y java.lang.Comparable.

Los métodos values(), ordinal() y valueOf() se encuentran en la clase java.lang.Enum:

  • values() devuelve todos los valores de la clase enum.
  • El método ordinal() puede encontrar el índice de cada constante de enumeración, como el índice de un array.
  • El método valueOf() devuelve la constante de enumeración con el valor de cadena especificado.

Ejemplo

enum Color
{
    RED, GREEN, BLUE;
}
 
public class Test
{
    public static void main(String[] args)
    {
        // Llamar a values()
        Color[] arr = Color.values();
 
        // Iterar la enumeración
        for (Color col : arr)
        {
            // Ver el índice
            System.out.println(col + " at index " + col.ordinal());
        }
 
        // Usar valueOf() para devolver la constante de enumeración; si no existe, se lanza IllegalArgumentException
        System.out.println(Color.valueOf("RED"));
        // System.out.println(Color.valueOf("WHITE"));
    }
}

El resultado de ejecutar el código anterior es:

RED at index 0
GREEN at index 1
BLUE at index 2
RED

Miembros de la clase enum

Las enumeraciones, al igual que las clases normales, pueden tener sus propias variables, métodos y constructores. El constructor solo puede usar el modificador de acceso private, por lo que no se puede invocar desde el exterior.

Las enumeraciones pueden contener tanto métodos concretos como métodos abstractos. Si la clase enum tiene métodos abstractos, cada instancia de la clase enum debe implementarlos.

Ejemplo

enum Color
{
    RED, GREEN, BLUE;
 
    // Constructor
    private Color()
    {
        System.out.println("Constructor called for : " + this.toString());
    }
 
    public void colorInfo()
    {
        System.out.println("Universal Color");
    }
}
 
public class Test
{    
    // Salida
    public static void main(String[] args)
    {
        Color c1 = Color.RED;
        System.out.println(c1);
        c1.colorInfo();
    }
}

El resultado de ejecutar el código anterior es:

Constructor called for : RED
Constructor called for : GREEN
Constructor called for : BLUE
RED
Universal Color
Otras extensiones