Wednesday, January 14, 2009

SCJP - 01 - Mais sobre os enums

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

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.




No comments:

Post a Comment

Regras são chatas, mas...
Todos os comentários são lidos e moderados previamente.
São publicados aqueles que respeitam as regras abaixo:

- Seu comentário precisa ter relação com o assunto do post;
- Em hipótese alguma faça propaganda de outros blogs ou sites;
- Não inclua links desnecessários no conteúdo do seu comentário;
- Se quiser deixar sua URL, comente usando a opção OpenID;
- CAIXA ALTA, miguxês ou erros de ortografia não serão tolerados;
- Ofensas pessoais, ameaças e xingamentos não são permitidos;