Enum e todos os seus recursos - 1

"Olá, amigo!"

"Olá, amigo!"

"Vou falar sobre algo muito interessante. É bem simples, mas isso o torna ainda mais interessante. Chama-se enum. Um enum é um tipo que define o conjunto específico de valores que uma variável pode ter. Vejamos em um exemplo logo de cara:"

Definição de uma classe enum
public enum Direction
{
 UP,
 DOWN,
 LEFT,
 RIGHT,
}
Usando uma enumeração
Direction direction = Direction.LEFT;

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

"Então, apenas listamos um conjunto de valores e pronto?"

"Sim, declaramos um enum e listamos todos os seus valores possíveis dentro dele, separados por vírgula."

"Também é muito fácil de usar."

"Você pode defini-lo como nulo?"

"Sim, um enum é uma classe regular, ou melhor, é como uma classe, semelhante a como as interfaces são como classes."

"Então, onde quer que eu possa usar classes, posso usar enum?"

"Sim."

"Posso declarar um enum dentro de uma classe?"

"Sim."

"E herdar um enum?"

"Não, você não pode herdar um enum e um enum não pode herdar outras classes."

"Por que é que?"

"Porque o compilador Java converte enums para aproximadamente isso:

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 você pode ver neste exemplo:"

1) A classe Direction herda absolutamente a classe Enum, portanto não pode herdar mais nada.

2) A classe Direction é declarada como final, então nada mais pode herdá-la.

3) As variáveis ​​da classe Direction são, na verdade, variáveis ​​públicas de direção final estáticas. Isso fica evidente no código que os utiliza:

Direção direção = Direção .LEFT ;

4) A classe Direction contém apenas um construtor e é privado. Isso significa que os objetos Direction só podem ser criados usando código dentro da classe. Além dos objetos declarados, nenhum objeto pode ser criado.

5) As variáveis ​​de direção podem receber uma referência a qualquer um dos objetos de direção existentes. Eles são todos definidos dentro do enum. Não há outros objetos desse tipo e não haverá outros no futuro.

6) Os objetos de direção podem ser comparados usando «==», que apenas executará uma comparação de referência simples."

"Eu não diria que é super claro, mas é muito mais claro depois do seu exemplo."

"Ótimo. Então aqui está um pouco mais de informação para você:"

1) Cada objeto Direction tem seu próprio número exclusivo. O primeiro (UP) é 0, o segundo (DOWN) é 1, o terceiro (LEFT) é 2, etc. Você pode obter esse número usando o método ordinal(). "Olhe para a tela:

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

2) Cada enum tem um método values ​​() que retorna um array dos valores do enum.

int leftIndex = Direction.LEFT.ordinal();

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

"Isso significa que podemos obter o índice de qualquer elemento enum e, em seguida, obter o elemento novamente usando esse índice."

"Também podemos usar um enum em um loop foreach :"

for (Direction direction : Direction.values())
{
 System.out.println(direction);
}
Saída da tela:
UP
DOWN
LEFT
RIGHT

"Isso significa que enum substitui o método toString? Afinal, ele não exibe nada como:"
«com.codegym.Direction@123fd4»?

"Sim. Além disso, cada enum e, portanto, Direction, podem ser convertidos em String e vice-versa."

Converter para uma String:
String left = Direction.LEFT.toString(); // left == "LEFT";
Converta uma String em uma enumeração:
Direction direction = Direction.valueOf("LEFT");

"Ah, entendi."

"O que acontece se você passar uma String para a função valueOf que não está em Direction? Por exemplo, «AMIGO»?"

"O que você acha?"

"Uma exceção?"

"Sim. Um IllegalArgumentException."

"Bem, isso encerra nossa introdução ao mundo dos enums."