Enums em Java
Autor: Luciano da Cunha | Publicado: 2012-02-07T15:58:00-08:00

O enum é uma lista enumerada que permite a restrição de um conjunto de  constantes. Pode ser considerado uma classe, sendo que poderá ser declarado somente como público, ou default. Perceba que nenhuma das classes foram declaradas como public, assim, é  possível declarar várias no mesmo arquivo, sendo todas as classes com nomes diferentes do nome do arquivo.

Estrutura (Código abaixo): 
palavra-chave: enum
Nome do enum (classe): EnumForaDaClasse
Constantes: VALOR1, ...
Observe o código abaixo:


/**
 * Nome do arquivo: Enums.java
 *
 */

enum EnumForaDaClasse {

 VALOR1, VALOR2, VALOR3
}

class ClasseComEnum {

 enum EnumDentroDaClasse { VALOR1, VALOR2, VALOR3 }

 EnumDentroDaClasse enumDentroDaClasse;

}

class EnumsTest {

 EnumForaDaClasse enum1;
 ClasseComEnum enum2;

 { enum2 = new ClasseComEnum(); }

 public static void main(String[] args){

  EnumsTest e1 = new EnumsTest();

  e1.enum1 = EnumForaDaClasse.VALOR1;
  e1.enum2.enumDentroDaClasse = ClasseComEnum.EnumDentroDaClasse.VALOR1;

  System.out.println("Valor de e1.enum1: " + e1.enum1);
  System.out.println("e1.enum1 instancia de " +
   "EnumForaDaClasse: " + (e1.enum1 instanceof EnumForaDaClasse));

 }

}

No código acima, a classe EnumsTest declara duas variáveis de instância, sendo:
EnumForaDaClasse enum1: Uma variável de instância, que é um enum do tipo EnumForaDaClasse. Declarando uma variável desse tipo, poderemos atribuir a ela, qualquer  um dos valores definidos dentro de suas chaves. Esse tipo é visível e acessado diretamente. Basta declarar uma variável do tipo do enum desejado e atribuir um dos valores  declarados no enum, acessando-o através do operador '.' (ponto).
ClasseComEnum enum2: Uma variável de instância que é do tipo ClasseComEnum. Quando um enum é declarado dentro de uma classe, não é possível declarar uma variável do seu valor diretamente, pois é necessário primeiramente instânciar a classe, e somente depois acessar o enum através de uma variável de instância declarada lá dentro.
Como toda a classe, o enum poderá ainda ter outros membros além das  constantes, como variáveis e métodos.

Uma outra observação é que as constantes do enum podem ser considerados como  instâncias da classe que as comportam.

Assim, VALOR1 é uma instância de  EnumCompleto. Mais um motivo pelo qual um enum pode possuir variáveis e métodos. Desta  forma, quando olhar a classe ou o enum abaixo, considere que a constante  VALOR1 é uma instância de EnumCompleto que possui:
Uma variável de instância: chamada valor, do tipo inteiro.
Um construtor: que recebe um valor inteiro e inicializa a variável de  instância.
E um método: que retorna um valor inteiro, a variável de instância.
enum EnumCompleto {

 VALOR1(42), VALOR2(21), VALOR3(84);

 EnumCompleto(int valor){

  this.valor = valor;

 }

 private int valor;

 public int getValor(){

  return this.valor;

 }

}

class TestaEnumCompleto{

 EnumCompleto ec;

 public static void main(String[] args){

  TestaEnumCompleto tec = new TestaEnumCompleto();
  tec.ec = EnumCompleto.VALOR2;

  // Imprimindo o enum.
  System.out.println("Valor do enum: " + tec.ec);

  // Testa a instância.
  System.out.println("instancia de EnumForaDaClasse: " +
   (tec.ec instanceof EnumCompleto));

  // Acessando sua variável de instância.
  System.out.println("Variavel de instancia de ec: " +
   tec.ec.getValor());

 }

}

Até mais,  []'s.