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
{
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
{
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
{
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
{
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
{
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
{
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 ColorOtras extensiones