14 janeiro 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.


Creative Commons License
Esta obra está licenciada sob uma Licença Creative Commons.
Comentários
0 Comentários

0 comments:

Postar um comentário

Regras são chatas, mas...

- 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;