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.