Exemplos de Enumerações (Java)

From Wiki**3

Revision as of 18:24, 23 October 2013 by Root (talk | contribs) (Experiência 2)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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