Declarando Enums


Java permite restringir uma variável a ter uma de apenas alguns valores pré-definidos, em outras palavras, um valor a partir de uma lista enumerada.
Os componentes básicos de um enum são suas constantes.

enum Refrigerante { COCA, FANTA, SODA

Enums podem ser declarados como classes separadas, ou como um membro de classe, entretanto, eles não devem ser declarados dentro de um método. Aqueles que não estão dentro de uma classe podem ser declarados apenas com os modificadores public ou deafult. Utiliza-se a palavra-chave enum para declará-los e é opcional o uso de ponto-e-vírgula no final da declaração.

package dec_enum;

enum Refrigerante {//não pode ser private ou protected
BIG, HUGE, OVERWHELMING

class Bebida {
      Refrigerante refri;
}


public class Bebida_Test {

      /* tb pode estar dentro de uma classe e pode
       * ter qualquer modificador de acesso; o
 * ponto-e-virgula é opcional na declaração */
protected enum Test { Test1, Test2, Test3 };
     
      public static void main(String[] args) {
            Bebida drink = new Bebida ();
            drink.refri = Refrigerante.BIG;                      System.out.println(drink.refri);
            System.out.println(Test.Test1);
      }
     
}

Enums são representados como instâncias static e final, o que significa que são constantes. Cada enum conhece seu index ou posição, o que significa que a ordem em que são declarados importa. Pode-se dizer que um enum é um array de algum tipo.

Declarando construtores, métodos e variáveis em um Enum

Pelo fato de um enum ser um tipo especial de classe, é possível adicionar construtores, variáveis de instância, métodos e um corpo de classe constante específica.
Todo enum possui um método estático chamado values(), que retorna um array com todos os enums na ordem em que foram declarados.

package declare_class_members;

enum Refri {
      //8,10,16 são passados para o construtor do enum
      COCA(2), FANTA(3), SODA(6);

      Refri(int qtd) { //construtor do enum
            this.qtd = qtd;
      }

      private int qtd; //variável de insância do enum

      public int getQtd() {//método get dentro do enum
            return qtd;
      }
}

class Bebida {

      Refri refri;

      public static void main(String[] args) {
            Bebida drink1 = new Bebida();
            drink1.refri = Refri.COCA;
            Bebida drink2 = new Bebida();
            drink2.refri = Refri.FANTA;
            for (Refri cs : Refri.values())
                System.out.print(cs+" "+cs.getQtd());
      }
}

Pontos a serem considerados sobre enums: não é possível invocar um construtor enum diretamente, pois o construtor enum é invocado automaticamente, com os argumentos definidos depois do valor constante; pode-se definir mais de um argumento para o construtor, e é possível sobrecarregar os construtores enums, assim como se pode sobrecarregar um construtor de uma classe normal; utiliza-se corpo de classe constante específica quando é necessária uma constante particular para substituir um método definido em um enum.

package dec_enum;

enum Refri2 { //possui 3 constantes
      COCA(8), //não possui corpo
      FANTA(10){ //corpo para essa constante
            /* sobrescrita (apenas para essa 
 * constante) do método declarado 
 * no enum */
            public String getCode() {
                  return "C";
            }
      }, 
      SODA(16) { //corpo para essa constante
            /* sobrescrita (apenas para essa
 * constante) do método declarado 
 * no enum */
            public String getCode() {
                  return "A";
            }
      }; //qdo segue mais código o (;) é obrigatório
     
      Refri2(int qtd) {
            this.qtd = qtd;
      }

      private int qtd;
      public String name;

      public int getQtd() {
            return qtd;
      }

      /* esse método é sobrescrito pelas constantes
       * FANTA e SODA */
      public String getCode() {
            return "B";
      }
}

class Bebida2 {

      Refri2 refri;

      public static void main(String[] args) {
            Bebida2 drink1 = new Bebida2();
            drink1.refri = Refri2.COCA;
            drink1.refri.name = "Teste1";
            Bebida2 drink2 = new Bebida2();
            drink2.refri = Refri2.FANTA;
            drink2.refri.name = "Teste2";
            for (Refri2 cs : Refri2.values()) {
                  System.out.println(cs.getQtd());
                  System.out.println(cs.name);
                  System.out.println(cs.getCode());
            }
      }
}

Fonte: SCJP Sun Certifi ed Programmer for Java 6 Study Guide

0 comentários:

Postar um comentário