Passo 1: Classes Curso e Turno Passo 2: Qual seria o tipo adequado para um turno? Passo 3: Turno é um candidato para uma enum
#PraCegoVer - Transcrição dos Slides Um curso possui um turno: manhã, tarde ou noite
Qual seria o tipo adequado para o campo turno? Se turno é uma string, seus valores podem ser manhça, tarde , noite, margarina, azul.... Se turno é um inteiro, seus valores podem ser 1, 2, -999, -2, 0...
Turno tem valores conhecidos. Um turno deve ser manhã, tarde ou noite. Se declararmos Turno como enum, limitamos seus valores a um pequeno conjunto de constantes: MANHA, TARDE ou NOITE

Criando uma primeira enum

Em Java, uma enum é um tipo no qual declaramos um conjunto de valores constantes pré-definidos. Sua sintaxe é muito semelhante à declaração de uma classe, exceto pelo uso da palavra chave enum que antecede seu nome.

Abaixo apresentamos como declarar a enum Turno:

public enum Turno  {
    MANHA, TARDE, NOITE;
}

Por serem os campos de uma enum constantes, seus nomes são escritos em letras maiúsculas. No exemplo acima temos três campos que correspondem aos turnos manhã, tarde e noite.

Para atribuir um desses valores a uma variável podemos fazer como no código abaixo:

Turno  turno = Turno.MANHA;

Perceba que ao utilizar enums limitamos os valores que podem ser atribuídos a uma variável. Sendo assim, devemos atribuir ao campo Turno um dos valores pré-definidos na enum Turno.

Classes enum e herança

Ao declarar uma enum estamos implicitamente estendendo a classe java.lang.Enum. Isso cria algumas limitações, porque o Java não suporta herança múltipla, o que impede uma classe enum de estender outras classes. Porém, uma classe enum pode ter propriedades, assim como um construtor e um método.

Propriedades

O código abaixo apresenta uma segunda versão da enum Turno, agora com a propriedade descrição, um construtor, que inicia essa propriedade, além de um método para retornar essa descrição:

public enum Turno {

    MANHA("manhã"),
    TARDE("tarde"),
    NOITE("noite");

    private String descricao;

    Turno(String descricao) {
        this.descricao = descricao;
    }

    public String getDescricao() {
        return descricao;
    }
}

O construtor de uma enum é sempre privado, não podendo ser invocado diretamente. Nele são iniciados todos os campos, que por serem constantes devem declarados antes das propriedades e do construtor da classe.

Propriedades

Métodos herdados de Enum

Uma vez que Turno herda de Enum, possui métodos declarados na classe pai. Um dos mais utilizados dentre eles é values(), que retorna um array contendo todos os campos da enum.

No exemplo a seguir imprimimos a descrição de cada um dos campos da enum Turno:

for (Turno t : Turno.values()) {
      System.out.println(t.getDescricao());
  }

Outros métodos úteis dessa classe são as apresentadas na Tabela 1:

Método Retorno Descrição
toString() String Retorna uma String com o nome da instância (em maiúsculas).
valueOf(String nome) static <T extends Enum<T>>
T
Retorna o objeto da classe enum cujo nome é a string do argumento.
ordinal() int Retorna o número de ordem do objeto na enumeração.

Tabela 1. Métodos úteis da classe