Não sei dos outros programadores java auto-didatas, mas eu sempre guardei em mente que os enums não passavam de uma coleção de constantes com um label associado a cada uma delas. E é interessante como a gente muda de conceito, ou aprende mais sobre tal, lendo uma fonte com um foco direcionado. Pois bem, um enum não é só isso. Ele é um tipo especial de classe, que pode possuir construtores, membros e métodos.
Tudo isso é mostrado no trecho de código a seguir
Palma, palma (cara pálida), não priemos cânico! Quando nós iniciamos os estudos sobre o enum, normalmente vemos algo parecido com:
E nós usamos isso apenas para identificar o tipo de alguma coisa. Nesse caso, tipos de níveis, mas poderiam ser tamanhos de café, de roupa, tipos de estratégia de ordenação de vetores, ou qualquer outra coisa enumerável, e então atribuir a variáveis, como abaixo:
Mas, como no primeiro trecho de código deste post, nós podemos também usar variáveis membro num enum. E como nós o encaramos como constantes, não acho muito aconselhável a existência de um método set() para suas variáveis membro. Note que, para o nível AVANCADO, o comportamento padrão do método getMensagemVitoria() é alterado. Além disso, o fato de não haver um public antes do construtor ajuda a entender o porquê dele não ser acessado diretamente. Também é possivel iterar sobre um enum. Isso é possível porque todo enum possui um método estático chamado values(), o qual retorna um array de valores do enum, ordenados segundo a sua declaração:
O trecho de código acima produz a seguinte saída:
enum Nivel {
FACIL(10),
INTERMEDIARIO(20),
/**
* O "{" inicia um bloco de código que define
* o "corpo" dessa constante
*/
AVANCADO(40) {
public String getMensagemVitoria() {
return "Parabéns! " +
"Você venceu todos os níveis!";
}
};
/**
* Mais código fonte virá a seguir,
* por isso é necessario o ";"
*/
private int pontuacao;
//definição do construtor para o enum
Nivel(int pontuacao) {
this.pontuacao = pontuacao;
}
public int getPontuacao() {
return pontuacao;
}
/**
* Comportamento padrão para o método
* que dá a mensagem de vitória
*/
public String getMensagemVitoria() {
return "Parabéns, " +
"você avançou para o próximo nível.";
}
}
Palma, palma (cara pálida), não priemos cânico! Quando nós iniciamos os estudos sobre o enum, normalmente vemos algo parecido com:
enum Nivel {
FACIL,
INTERMEDIARIO,
AVANCADO
}
E nós usamos isso apenas para identificar o tipo de alguma coisa. Nesse caso, tipos de níveis, mas poderiam ser tamanhos de café, de roupa, tipos de estratégia de ordenação de vetores, ou qualquer outra coisa enumerável, e então atribuir a variáveis, como abaixo:
Nivel nivelAtual = Nivel.AVANCADO;
Mas, como no primeiro trecho de código deste post, nós podemos também usar variáveis membro num enum. E como nós o encaramos como constantes, não acho muito aconselhável a existência de um método set() para suas variáveis membro. Note que, para o nível AVANCADO, o comportamento padrão do método getMensagemVitoria() é alterado. Além disso, o fato de não haver um public antes do construtor ajuda a entender o porquê dele não ser acessado diretamente. Também é possivel iterar sobre um enum. Isso é possível porque todo enum possui um método estático chamado values(), o qual retorna um array de valores do enum, ordenados segundo a sua declaração:
for (Nivel nivel : Nivel.values()) {
System.out.println(nivel + " dá " +
nivel.getPontuacao() +
" pontos.");
}
O trecho de código acima produz a seguinte saída:
FACIL dá 10 pontos. INTERMEDIARIO dá 20 pontos. AVANCADO dá 40 pontos.
