Você está na página 1de 3

Classes tipo enum (enum types)

Miguel Jonathan rev. junho de 2011

Em diversas situaes, precisamos de classes que possuem as seguintes caractersticas: a) S deve existir um nmero fixo de objetos dessa classe, j pr-determinados (por ex: os planetas do Sistema Solar, os naipes das cartas do baralho, as estaes do ano, os dias da semana, etc).

b) Cada objeto da classe (ex: MERCURIO, VENUS, TERRA, etc,, da classe Planeta) j possui um nome fixo e imutvel, como uma constante esttica da classe. Pode ser referenciada diretamente a partir do nome da classe. Ex: Planeta.TERRA c) Esses objetos podem ser utilizados como se fossem membros de uma coleo ordenada (por exemplo, iterar sobre todos eles, obter o anterior, ou o seguinte, etc).

Essas classes recebem o nome de "tipo enum" ou "enum type" em ingls. A declarao similar de uma classe, com a palavra class substituda por enum: public enum <nome do tipo enum> { ............ } Propriedades: As instncias dos tipos enum so criadas e nomeadas junto com a declarao da classe. Essas instncias so fixas e imutveis. No permitido criar novas instncias com new. O construtor privativo, embora no precise de modificador private explcito. Os nomes recebem todas as letras em MAISCULAS, por conveno, pois so objetos constantes, imutveis. As instncias dos tipos enum precisam ter obrigatoriamente apenas um nome. Opcionalmente, a declarao da classe pode incluir variveis de instncia, construtor, mtodos de instncia, de classe, etc. Todo tipo enum ao ser criado j dispe de alguns mtodos, herdados da classe java.lang.Enum, entre eles: - static values() - retorna um vetor com referncias a todos os objetos da classe, organizado na ordem em que as instncias foram declaradas (mtodo de classe). - boolean equals() - permite comparar duas referncias a objetos da classe. - String toString() - retorna uma String com o nome da instncia (em maisculas). - valueOf(String nome) retorna o objeto da classe enum cujo nome a string do argumento. - int ordinal() - retorna o nmero de ordem do objeto na enumerao. Alguns exemplos de uso: a) Um exemplo trivial: O enum Naipe possui exatamente 4 instncias imutveis, nomeadas nesta ordem: ESPADAS, OUROS, PAUS e COPAS. As instncias no possuem variveis de instncia. A classe TestaNaipe mostra como se pode obter referncias a uma instncia usando o nome da classe seguido do nome da instncia (como em Naipe.OUROS), e o uso do mtodo de classe values() para obter um vetor com todos os naipes. Mostra tambm que cada instncia imprime com o seu prprio nome, o que dado pelo mtodo toString() que vem embutido.
public enum Naipe { ESPADAS, OUROS, PAUS, COPAS; } //note as letras maisculas

public class TestaNaipe { public static void main(String[] args) { Naipe x; x = Naipe.OUROS; // constante da classe System.out.println(x); // imprime OUROS, por conta do toString() da classe. Naipe[]v = Naipe.values(); //retorna um vetor com os 4 naipes, na ordem. System.out.println(v[0]); imprime ESPADAS System.out.println(x.ordinal()); // imprime 1 (a posio de OUROS na sequencia) } }

b) Um exemplo mais sofisticado ( ref: http://download.oracle.com/javase/1.5.0/docs/guide/language/enums.html) O enum Planeta tem exatamente 9 instncias nomeadas, que so s planetas conhecidos do Sistema Solar (Pluto ainda planeta honorrio...). Nesse exemplo, os planetas possuem atributos: massa e raio. Vemos que a enumerao das instncias j inclui chamadas automticas do construtor. O enum possui tambm mtodos de instncia e mtodos estticos (de classe), como em qualquer classe. A classe TestaPlaneta usa um argumento no seu main(), que o peso na Terra em kg, como em:
TestaPlaneta 70

A classe imprime o peso equivalente que seria percebido na superfcie de cada um dos planetas. Note tambm que o exemplo usa o mtodo printf() que praticamente o mesmo que em C, que ficou disponvel a partir da verso 5.0.
public enum Planeta { // As proximas linhas so chamadas especiais ao construtor interno. // Passando como parametros a massa e o raio de cada planeta. MERCURIO (3.303e+23, 2.4397e6), VENUS (4.869e+24, 6.0518e6), TERRA (5.976e+24, 6.37814e6), MARTE (6.421e+23, 3.3972e6), JUPITER (1.9e+27, 7.1492e7), SATURNO (5.688e+26, 6.0268e7), URANO (8.686e+25, 2.5559e7), NETUNO (1.024e+26, 2.4746e7), PLUTAO (1.27e+22, 1.137e6); // variveis de instncia de cada planeta: private final double massa; // em kilogramas private final double raio; // em metros // Construtor privativo, automaticamente chamado: Planeta(double massa, double raio) { this.massa = massa; this.raio = raio; } // Metodos de instancia public double getMassa(){ return massa; } public double getRaio() { return raio; } // constante gravitacional universal (m3 kg-1 s-2) public static final double G = 6.67300E-11; double gravidadeSuperficie() { return G * massa / (raio * raio); } double pesoSuperficie(double outraMassa) { return outraMassa * gravidadeSuperficie(); } } public class TestaPlaneta { public static void main(String[] args) { // args[0] argumento da chamada de main() if(args.length< 1) System.out.println("Para rodar, use um argumento com o seu peso em kg"); else { double pesoNaTerra = Double.parseDouble(args[0]); double massa = pesoNaTerra/Planeta.TERRA.gravidadeSuperficie(); // iterando sobre os objetos da classe. // Planeta,values() retorna um vetor com todos os planetas.

for (Planeta p : Planeta.values()){ String s = "Voce pesa " + (p.equals(Planeta.TERRA)?"na":"em"); System.out.printf("%s %s %.2f quilos%n", s,p, p.pesoSuperficie(massa)); } } } }

Esse teste deve ser rodado com um argumento do main(). Os argumentos vo para o vetor args. Na falta do argumento, o main() imprime a mensagem:
"Para rodar, use um argumento com o seu peso em kg"

Isso ocorre se args.length < 1. Um exemplo de execuo do main (com linha de comando):
$ java TestaPlaneta 80 Voce Voce Voce Voce Voce Voce Voce Voce Voce pesa pesa pesa pesa pesa pesa pesa pesa pesa em em na em em em em em em MERCURIO 30,22 quilos VENUS 72,40 quilos TERRA 80,00 quilos MARTE 30,30 quilos JUPITER 202,44 quilos SATURNO 85,28 quilos URANO 72,41 quilos NETUNO 91,07 quilos PLUTAO 5,35 quilos

Referncias adicionais: 1. A seo 8.9 do livro "The Java Language Specification, Third Edition", de James Gosling et. al., traz mais exemplos e informaes. 2. O Apndice B do livro texto "Use a Cabea-Java!" apresenta uma breve discusso do tema.