Ir para o conteúdo

Enumerações

Definição

Enumerações são um tipo especial de classe que define um conjunto finito de objetos imutáveis nomeados, chamado de enumeradores.

Implementação de enumerações no Java

A palavra reservada enum define o tipo de dados enumeração. Os enumeradores são identificados com todas as letras em caixa alta.

public enum Prioridade{
  BAIXA,
  MEDIA,
  ALTA,
  URGENTE
}

Cada enumerador possui como tipo a própria enumeração. Assim, o tipo do enumerador BAIXA é Prioridade. Ao ser convertido para texto, o enumerador produz seu próprio nome.

Prioridade p = Prioridade.BAIXA;

// BAIXA
System.out.println(p);

Um enumerador não pode ser instanciado com o operador new. O valor de uma variável deve ser definida a partir do objeto constante na enumeração. Como cada enumerador possui uma única instância, é seguro compará-los com o operador ==.

Prioridade p = Prioridade.ALTA;

if(p == Prioridade.ALTA){
  System.out.println("A prioridade é alta");
}

Método values

O método values retorna um arranjo contendo todos os enumeradores definidos na enumeração.

for(var enumerador : Prioridade.values()){
  System.out.println(enumerador);
}

Método valueOf

O método valueOf retorna o enumerador cujo nome corresponde à String informada por parâmetro.

var prioridade = Prioridade.valueOf("ALTA");
System.out.println(prioridade);

Caso não existir uma enumeração que corresponde à String informada por parâmetro, uma exceção será lançada.

Construtores, atributos e métodos

As enumerações podem possuir construtores, atributos e métodos assim como as outras classes. Os construtores de uma enumeração são privados e não podem ser invocados diretamente com o operador new. Quando a enumeração define um construtor com parâmetros, é necessário informar os valores correspondentes para cada enumerador.

public enum Prioridade{
  BAIXA(0),
  MEDIA(1),
  ALTA(2),
  URGENTE(3);

  private int valor;

  private Prioridade(int valor){
    this.valor = valor;
  }
  
  public int valor(){
    return valor;
  }
}

Os construtores de enumerações são privados e não podem ser invocados diretamente com o operador new. Cada enumerador é criado durante a inicialização da enumeração e recebe os valores definidos em sua declaração.

// Imprime 2
System.out.println(Prioridade.ALTA.valor());

Uso em estruturas switch

Enumerações podem ser utilizadas em estruturas switch, permitindo executar comportamentos diferentes para cada enumerador.

Prioridade prioridade = Prioridade.ALTA;

switch (prioridade) {
  case BAIXA:
    System.out.println("Prioridade baixa");
    break;

  case MEDIA:
    System.out.println("Prioridade média");
    break;

  case ALTA:
    System.out.println("Prioridade alta");
    break;

  case URGENTE:
    System.out.println("Prioridade urgente");
    break;
}

Ao utilizar uma enumeração em um switch, os rótulos case devem utilizar apenas o nome dos enumeradores, sem o prefixo do tipo.

// Correto
case ALTA:

// Incorreto
case Prioridade.ALTA:

Representação de Enumerações na UML

Nos diagramas de classe da UML, as enumerações são representadas pelo estereótipo enumeration. Por convenção, os enumeradores são escritos em caixa alta.