Enumerações (Java)/Exemplo: Planetas: Difference between revisions

From Wiki**3

< Enumerações (Java)
 
Line 1: Line 1:
{{TOCright}}
#REDIRECT [[ist:Enumerações (Java)/Exemplo: Planetas]]
== Planetas: 1ª versão ==
 
Exemplo adaptado do manual de Java 1.5 da [http://www.sun.com/ Sun Microsystems, Inc.] [http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html]
<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("** 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 ===
 
  <FONT COLOR="#800000"><B>$ java Teste1</B></FONT>
  ** Planeta
  MERC&Uacute;RIO
  V&Eacute;NUS
  TERRA
  MARTE
  J&Uacute;PITER
  SATURNO
  URANO
  NEPTUNO
  PLUT&Atilde;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 ===
 
  <FONT COLOR="#800000"><B>$ java Teste2 81</B></FONT>
  Peso em MERC&Uacute;RIO &eacute; 30.598367
  Peso em V&Eacute;NUS &eacute; 73.304927
  Peso em TERRA &eacute; 81.000000
  Peso em MARTE &eacute; 30.677712
  Peso em J&Uacute;PITER &eacute; 204.975160
  Peso em SATURNO &eacute; 86.347259
  Peso em URANO &eacute; 73.315303
  Peso em NEPTUNO &eacute; 92.204574
  Peso em PLUT&Atilde;O &eacute; 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 ===
 
  <FONT COLOR="#800000"><B>$ java Teste3</B></FONT>
  Peso em MERC&Uacute;RIO &eacute; 30.598367
  Peso em V&Eacute;NUS &eacute; 73.304927
  Peso em TERRA &eacute; 81.000000
  Peso em MARTE &eacute; 30.677712
  Peso em J&Uacute;PITER &eacute; dif&iacute;cil de calcular
  Peso em SATURNO &eacute; dif&iacute;cil de calcular
  Peso em URANO &eacute; dif&iacute;cil de calcular
  Peso em NEPTUNO &eacute; dif&iacute;cil de calcular
  Peso em PLUT&Atilde;O &eacute; 5.416831
 
Nesta listagem pode apreciar-se claramente a criação automática de classes internas anónimas (marcadas a <font color="blue">azul</font>) para comportar a implementação do comportamento específico das instâncias <code>JÚPITER</code>, <code>SATURNO</code>, <code>URANO</code> e <code>NEPTUNO</code>.
 
  <FONT COLOR="#800000"><B>$ ls</B></FONT>
  <B>Planeta.java</B> Planeta.class <font color="blue">Planeta$1.class Planeta$2.class Planeta$3.class Planeta$4.class</font>
  <B>Teste2.java</B> Teste2.class
 
[[category:Ensino]]
[[category:PO]]
[[category:PO Exemplos]]
[[category:Java]]

Latest revision as of 16:47, 7 November 2018