Enumerações (Java)

From Wiki**3

Programação com Objectos
Introduction
Creation and Destruction
Inheritance & Composition
Abstraction & Polymorphism
Code Organization
Java Topics
Inner Classes
Enumerations
Data Structures
Exceptions
Input/Output
RTTI
Other Topics
JUnit Tests
UML Topics
Design Patterns
"Simple" Factory
Composite & Visitor
Command
Strategy & State
Template Method
Observer
Abstract Factory
Decorator & Adapter
Façade (aka Facade)

Enumerações, como o nome indica, são listas de valores associados a um conceito. Até à versão 1.5, e ao contrário de outras linguagens, o Java não dispunha de nenhum método de definição de enumerações. Não quer isto dizer que não fosse possível definir entidades que pudessem ser utilizadas quase com a mesma semântica, apesar de não estar disponível o suporte do compilador para a verificação de tipos.

Veja-se o seguinte exemplo, no qual se definem as estações do ano como constantes:

  interface Estação {
    int PRIMAVERA = 0;
    int VERÃO     = 1;
    int OUTONO    = 2;
    int INVERNO   = 3;
  }

Definida desta forma, é possível a um programa referir Estação.PRIMAVERA e obter uma entidade constante para referir um conceito. No entanto, não é possível esquecer-se que o que se manipula realmente é um inteiro e é precisamente isso que o compilador vê.

Como se verá abaixo, é possível definir estes conceitos de forma sólida e muito mais poderosa do que é habitual em linguagens como o C ou o C++.

Enumerações como Classes de Domínio Finito

Linguagens como o C permitem a definição de enumerações simples:

 enum Estacao {
   PRIMAVERA, VERAO, OUTONO, INVERNO
 };

No entanto, esta definição pouco mais é que uma lista de valores inteiros (que, de facto, são), não havendo diferenças no seu processamento por parte da linguagem, relativamente ao processamento dos inteiros.

O mesmo caso, em Java, apresenta um aspecto enganosamente semelhante:

 enum Estação {
   PRIMAVERA, VERÃO, OUTONO, INVERNO
 }

No entanto, e apesar das semelhanças superficiais apresentadas pelo exemplo acima, relativamente ao exemplo em C, o significado é radicalmente diferente. Enquanto que os valores do enumerado C são meros inteiros, os do enumerado Java são objectos por direito próprio. Assim, apesar de se poder utilizar PRIMAVERA como um valor em ambas as linguagens, em C ele é 0 (zero) e em Java é, simplesmente, PRIMAVERA.

Na realidade, o que se tem, no caso do Java, é uma classe de objectos que contém apenas quatro instâncias, que são definidas por enumeração exaustiva do conjunto. Internamente, o compilador associa classes e implementações a cada uma delas, como se verá ao longo dos exemplos.

Do que se disse, pode ser correctamente inferido que os "valores" podem ser tratados como quaisquer objectos em Java, sendo inclusivamente possível associar-lhes atributos e comportamento. Estes aspectos fazem dos tipos enumerados muito mais que simples listas de valores nomeados.

Propriedades dos enumerados

Sendo classes, a definição de enumerados é em tudo semelhante à definição de uma classe concreta em Java.

As principais diferenças são a impossibilidade de ter subclasses e de se criarem instâncias além das que já foram enumeradas.

Enumerações noutras linguagens

  • Type safety
  • Propriedades

Exemplos