segunda-feira, 30 de setembro de 2013

Enumerados

Antes de o tipo enum ser adicionado em Java, eram usados inteiros nomeados para fazer seu trabalho.
Ex:

public static final int MES_JANEIRO = 1;
public static final int MES_FEVEREIRO = 2;
public static final int MES_MARCO = 3;
//...

Porem usando esse desse tipo, ele tem muita deficiência (tipo multiplicar um pelo outro, igualar, e etc...) e também não existe uma maneira fácil de converter constantes enumeradas int em strings. Programas que usam esse tipo de padrão são muito frágeis.
A partir do Java 1.5 já esta incluso o tipo enum Java. Sua principal funcionalidade é agrupar valores de mesmo sentido e também deixar o código mais legível. No exemplo a seguir agrupamos os nomes dos meses dentro de um enum chamado Mês.

public  enum Mes {JANEIRO, FEVEREIRO, MARCO} //...

Assim se você declarar um parâmetro do tipo Mes do qual o objeto passado só poderá receber valores que estão em nosso enum.

Mes m = Mes.JANEIRO

// A VARIAVEL M RECEBERA JANEIRO

m = Mes.FEVEREIRO

// AGORA M RECEBEBERA FEVEREIRO

m = Mes.ALGUMACOISA

// RESULTA EM ERRO PORQUE "ALGUMACOISA" NÂO
//  É UM VALOR DO TIPO ENUMERADO MES

Tipos enum's são implicitamente final e suas constantes são static. São usadas com mais freqüência quando se precisar de um conjunto finito de constantes. No enum você também pode adicionar método e campos arbitrários, NUNCA são usados dentro de métodos.
O enumerado é muito semelhante a de uma classe, porém todos seus valores nunca poderão ser modificados. O construtor por exemplo é muito semelhante a de classe, só que sua usabilidade se da somente para indicar o que cada valor contido na constante significa.
Não é aconselhado usar o método “ordinal()” para retornar o valor da posição da constante. É muito melhor armazená-lo em um campo de instancia, pois caso algum dia você alterar seu código e mudar a seqüência das constantes não mudaria os valores delas, como aconteceria se usássemos o método ordinal.

public  enum Mes {
 JANEIRO(1),
 FEVEREIRO(2),
 MARCO(3);

 private final int numeromes;

 private Mes(int numeromes){
  this.numeromes=numeromes;
 }
}

Exemplo de uso de gets, construtor e toString(Override) :

public class Teste {
    public  enum Mes {
        JANEIRO("Janeiro",31),
        FEVEREIRO("Fevereiro",28),
        MARCO("Março",31);
        //...
        private final int dias;
        private final String nome;
        
        private Mes(String nome, int dias){
            this.nome = nome;
            this.dias = dias;
        }
        public int getDias(){
            return dias;
        }
        public String getNome(){
            return nome;
        }
        @Override
        public String toString(){
            return "Mes: "+nome+" tem "+dias+" dias.";
        }

    }
    
    public static void main(String[] args) {
       
        //PERCORRER VALORES
        for(Mes m  : Mes.values()) {
                System.out.println(m); // Automaticamente
                                       // chama m.toString()
        } 
    }
}

Referências:

Java Efetivo do Joshua Block, Arquiteto de Software na Google.

Blog Red Pill do Marcio Torres, Analista e Desenvolvedor de Sistemas/Professor no IFRS

Site Tiexpert, post do Denys William Xavier.

Nenhum comentário:

Postar um comentário