Exemplos de Enumerações (Java)

From Wiki**3

Estações

Este exemplo mostra um tipo enumerado na sua versão mais simples, i.e., apenas se indicam os elementos que constituem a enumeração. <java5>

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

</java5>

Planetas: 1ª versão

Exemplo adaptado do manual de Java 1.5 da Sun Microsystems, Inc. [1] <java5>

public enum Planeta {
  MERCÚRIO  (3.303e+23, 2.4397e6),
  VÉNUS     (4.869e+24, 6.0518e6),
  TERRA     (5.976e+24, 6.37814e6),
  MARTE     (6.421e+23, 3.3972e6),
  JÚPITER   (1.9e+27,   7.1492e7),
  SATURNO   (5.688e+26, 6.0268e7),
  URANO     (8.686e+25, 2.5559e7),
  NEPTUNO   (1.024e+26, 2.4746e7),
  PLUTÃO    (1.27e+22,  1.137e6);

  // constante de gravitação universal
  public static final double G = 6.67300E-11;  // m³/kg/s²

  private double _massa;  // kg
  private double _raio;   // m

  public double massa() { return _massa; }
  public double raio()  { return _raio;  }

  Planeta(double massa, double raio) { _massa = massa; _raio  = raio; }

  // gravidade à superfície
  public double gravidade() { return G * _massa / (_raio * _raio);  }

  // peso (N) de outra massa (kg) à superfície
  public double peso(double massa) { return massa * gravidade(); }
}

</java5>

Experiência 1

Programa de Teste

<java5>

public class Teste1 {
  public static void main(String[] args) {
    System.out.println("** Estações");
    for (Estação e : Estação.values()) 
      System.out.println(e);
    System.out.println("** Planetas");
    for (Planeta p : Planeta.values()) 
      System.out.println(p);
    // Planeta x = new Planeta(2.5e22, 2e6);   // erro: tipo não pode ser instanciado
  } 
}

</java5>

Resultados

 $ java Teste1
 ** Estação
 PRIMAVERA
 VERÃO
 OUTONO
 INVERNO
 ** Planeta
 MERCÚRIO
 VÉNUS
 TERRA
 MARTE
 JÚPITER
 SATURNO
 URANO
 NEPTUNO
 PLUTÃO

Experiência 2

Programa de Teste

<java5>

public class Teste2 {
  public static void main(String[] args) {
    double pesoNaTerra = Double.parseDouble(args[0]);
    double massa       = pesoNaTerra / Planeta.TERRA.gravidade();
    for (Planeta p : Planeta.values()) {
      System.out.printf("Peso em %s é %f%n", p, p.peso(massa));
    }
  } 
}

</java5>

Resultados

 $ java Teste2 81
 Peso em MERCÚRIO é 30.598367
 Peso em VÉNUS é 73.304927
 Peso em TERRA é 81.000000
 Peso em MARTE é 30.677712
 Peso em JÚPITER é 204.975160
 Peso em SATURNO é 86.347259
 Peso em URANO é 73.315303
 Peso em NEPTUNO é 92.204574
 Peso em PLUTÃO é 5.416831

Planetas: 2ª versão

<java5>

public class NoSurfaceException extends Exception {}

</java5> <java5>

public enum Planeta {
  MERCÚRIO (3.303e+23, 2.4397e6),
  VÉNUS    (4.869e+24, 6.0518e6),
  TERRA    (5.976e+24, 6.37814e6),
  MARTE    (6.421e+23, 3.3972e6),
  JÚPITER  (1.9e+27,   7.1492e7) { public double peso(double m) throws NoSurfaceException { throw new NoSurfaceException(); } },
  SATURNO  (5.688e+26, 6.0268e7) { public double peso(double m) throws NoSurfaceException { throw new NoSurfaceException(); } },
  URANO    (8.686e+25, 2.5559e7) { public double peso(double m) throws NoSurfaceException { throw new NoSurfaceException(); } },
  NEPTUNO  (1.024e+26, 2.4746e7) { public double peso(double m) throws NoSurfaceException { throw new NoSurfaceException(); } },
  PLUTÃO   (1.27e+22,  1.137e6);

  // constante de gravitação universal
  public static final double G = 6.67300E-11; // m³/kg/s²

  private double _massa;  // kg
  private double _raio;   // m

  public double massa() { return _massa; }
  public double raio()  { return _raio;  }

  Planeta(double massa, double raio) { _massa = massa; _raio  = raio; }

  // gravidade à superfície
  public double gravidade() { return G * _massa / (_raio * _raio); }

  // peso (N) de outra massa (kg) à superfície
  public double peso(double massa) throws NoSurfaceException { return massa * gravidade(); }
}

</java5>

Experiência 3

Programa de Teste

<java5>

public class Teste3 {
  public static void main(String[] args) {
    double pesoNaTerra = Double.parseDouble(args[0]);
    double massa       = pesoNaTerra / Planeta.TERRA.gravidade();
    for (Planeta p : Planeta.values()) {
      double peso;
      try {
        peso = p.peso(massa);
        System.out.printf("Peso em %s é %f%n", p, peso);
      }
      catch (NoSurfaceException nse) {
        System.out.printf("Peso em %s é difícil de calcular%n", p);
      }
    }
  }
}

</java5>

Resultados

 $ java Teste3
 Peso em MERCÚRIO é 30.598367
 Peso em VÉNUS é 73.304927
 Peso em TERRA é 81.000000
 Peso em MARTE é 30.677712
 Peso em JÚPITER é difícil de calcular
 Peso em SATURNO é difícil de calcular
 Peso em URANO é difícil de calcular
 Peso em NEPTUNO é difícil de calcular
 Peso em PLUTÃO é 5.416831

Nesta listagem pode apreciar-se claramente a criação automática de classes internas anónimas (marcadas a azul) para comportar a implementação do comportamento específico das instâncias JÚPITER, SATURNO, URANO e NEPTUNO.

 $ ls
 Planeta.java Planeta.class Planeta$1.class Planeta$2.class Planeta$3.class Planeta$4.class
 Teste2.java Teste2.class