Enum y todas sus características - 1

"¡Hola, amigo!"

"¡Hola, amigo!"

"Voy a contarles algo muy interesante. Es bastante simple, pero eso lo hace aún más interesante. Se llama enumeración. Una enumeración es un tipo que define el conjunto específico de valores que puede tener una variable. Veamos en un ejemplo de inmediato:"

Definición de una clase de enumeración
public enum Direction
{
 UP,
 DOWN,
 LEFT,
 RIGHT,
}
Usando una enumeración
Direction direction = Direction.LEFT;

if (direction == Direction.LEFT)
 direction = Direction.RIGHT;
else
 direction = Direction.DOWN;

"Entonces, ¿simplemente enumeramos un conjunto de valores y eso es todo?"

"Sí, declaramos una enumeración y enumeramos todos sus valores posibles dentro, separados por una coma".

"También es bastante fácil de usar".

"¿Puedes ponerlo en nulo?"

"Sí, una enumeración es una clase regular, o más bien es como una clase, similar a cómo las interfaces son como clases".

"Entonces, donde sea que pueda usar clases, ¿puedo usar enum?"

"Sí."

"¿Puedo declarar una enumeración dentro de una clase?"

"Sí."

"¿Y heredar una enumeración?"

"No, no puede heredar una enumeración y una enumeración no puede heredar otras clases".

"¿Porqué es eso?"

"Debido a que el compilador de Java convierte las enumeraciones en aproximadamente esto:

public final class Direction extends Enum
{
 public static final Direction UP = new Direction();
 public static final Direction DOWN = new Direction();
 public static final Direction LEFT = new Direction();
 public static final Direction RIGHT = new Direction();

 private Direction() {} // Private constructor
}

"Como puede ver en este ejemplo:"

1) La clase Direction hereda absolutamente la clase Enum, por lo que no puede heredar nada más.

2) La clase Direction se declara como final, por lo que nada más puede heredarla.

3) Las variables de la clase Direction son en realidad variables de dirección finales estáticas públicas. Esto es evidente en el código que los usa:

Dirección dirección = Dirección .IZQUIERDA ;

4) La clase Dirección contiene solo un constructor y es privado. Eso significa que los objetos de dirección solo se pueden crear usando código dentro de la clase. Aparte de los objetos declarados, no se pueden crear objetos.

5) A las variables de dirección se les puede asignar una referencia a cualquiera de los objetos de dirección existentes. Todos ellos están establecidos dentro de la enumeración. No hay otros objetos de este tipo, y no habrá otros en el futuro.

6) Los objetos de dirección se pueden comparar usando «==», que solo realizará una comparación de referencia simple.

"No diría que es súper claro, pero es mucho más claro después de tu ejemplo".

"Genial. Entonces aquí hay un poco más de información para ti:"

1) Cada objeto Dirección tiene su propio número único. El primero (ARRIBA) es 0, el segundo (ABAJO) es 1, el tercero (IZQUIERDA) es 2, etc. Puede obtener este número usando el método ordinal(). "Mira a la pantalla:

Direction direction = Direction.LEFT;
int index = direction.ordinal();
int index2 = Direction.RIGHT.ordinal();

2) Cada enumeración tiene un método de valores () que devuelve una matriz de los valores de la enumeración.

int leftIndex = Direction.LEFT.ordinal();

Direction[] array = Direction.values();
Direction left = array[leftIndex];

"Esto significa que podemos obtener el índice de cualquier elemento de enumeración y luego obtener el elemento nuevamente usando ese índice".

"También podemos usar una enumeración en un bucle foreach :"

for (Direction direction : Direction.values())
{
 System.out.println(direction);
}
Salida de pantalla:
UP
DOWN
LEFT
RIGHT

"¿Eso significa que enum anula el método toString? Después de todo, no muestra nada como:"
«com.codegym.Direction@123fd4»?

"Sí. Además, cada enumeración y, por lo tanto, Dirección, se pueden convertir en una Cadena y viceversa".

Convertir a una cadena:
String left = Direction.LEFT.toString(); // left == "LEFT";
Convierta una cadena en una enumeración:
Direction direction = Direction.valueOf("LEFT");

"Oh, lo tengo".

"¿Qué pasa si le pasas un String a la función valueOf que no está en Direction? Por ejemplo, «AMIGO»?"

"¿Qué opinas?"

"¿Una excepción?"

"Sí. Una IllegalArgumentException".

"Bueno, eso concluye nuestra introducción al mundo de las enumeraciones".