Difference between revisions of "Exemplos de Enumerações (Java)"

From Wiki**3

(Experiência 2)
 
(16 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
{{TOCright}}
 
{{TOCright}}
 
+
<!-- exemplos da aula 14 -->
 
== Estações ==
 
== 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.
 
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>
  
  <B>public</B> <B>enum</B> Estação {
+
== Planetas: versão ==
    <FONT COLOR="#000080">PRIMAVERA</FONT>, <FONT COLOR="#000080">VERÃO</FONT>, <FONT COLOR="#000080">OUTONO</FONT>, <FONT COLOR="#000080">INVERNO</FONT>
 
  }
 
 
 
== 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]
 
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>
  
  <B>public</B> <B>enum</B> Planeta {
+
== Experiência 1 ==
    <FONT COLOR="#000080">MERCÚRIO</FONT>  (<FONT COLOR="#800080">3.303e+23</FONT>, <FONT COLOR="#800080">2.4397e6</FONT>),
 
    <FONT COLOR="#000080">VÉNUS</FONT>    (<FONT COLOR="#800080">4.869e+24</FONT>, <FONT COLOR="#800080">6.0518e6</FONT>),
 
    <FONT COLOR="#000080">TERRA</FONT>    (<FONT COLOR="#800080">5.976e+24</FONT>, <FONT COLOR="#800080">6.37814e6</FONT>),
 
    <FONT COLOR="#000080">MARTE</FONT>    (<FONT COLOR="#800080">6.421e+23</FONT>, <FONT COLOR="#800080">3.3972e6</FONT>),
 
    <FONT COLOR="#000080">JÚPITER</FONT>  (<FONT COLOR="#800080">1.9e+27</FONT>,  <FONT COLOR="#800080">7.1492e7</FONT>),
 
    <FONT COLOR="#000080">SATURNO</FONT>  (<FONT COLOR="#800080">5.688e+26</FONT>, <FONT COLOR="#800080">6.0268e7</FONT>),
 
    <FONT COLOR="#000080">URANO</FONT>    (<FONT COLOR="#800080">8.686e+25</FONT>, <FONT COLOR="#800080">2.5559e7</FONT>),
 
    <FONT COLOR="#000080">NEPTUNO</FONT>  (<FONT COLOR="#800080">1.024e+26</FONT>, <FONT COLOR="#800080">2.4746e7</FONT>),
 
    <FONT COLOR="#000080">PLUTÃO</FONT>    (<FONT COLOR="#800080">1.27e+22</FONT>,  <FONT COLOR="#800080">1.137e6</FONT>);
 
 
 
    <I><FONT COLOR="#808080">// constante de gravita&ccedil;&atilde;o universal</FONT></I>
 
    <B>public</B> <FONT COLOR="#800000">static</FONT> <FONT COLOR="#800000">final</FONT> <FONT COLOR="#800000">double</FONT> G = <FONT COLOR="#800080">6.67300E-11</FONT>;  <I><FONT COLOR="#808080">// m&sup3;/kg/s&sup2;</FONT></I>
 
 
 
    <B>private</B> <FONT COLOR="#800000">double</FONT> _massa;  <I><FONT COLOR="#808080">// kg</FONT></I>
 
    <B>private</B> <FONT COLOR="#800000">double</FONT> _raio;  <I><FONT COLOR="#808080">// m</FONT></I>
 
 
 
    <B>public</B> <FONT COLOR="#800000">double</FONT> <FONT COLOR="#000080">massa</FONT>() { <B>return</B> _massa; }
 
    <B>public</B> <FONT COLOR="#800000">double</FONT> <FONT COLOR="#000080">raio</FONT>()  { <B>return</B> _raio;  }
 
 
 
    <FONT COLOR="#000080">Planeta</FONT>(<FONT COLOR="#800000">double</FONT> massa, <FONT COLOR="#800000">double</FONT> raio) { _massa = massa; _raio  = raio; }
 
 
 
    <I><FONT COLOR="#808080">// gravidade &agrave; superf&iacute;cie</FONT></I>
 
    <B>public</B> <FONT COLOR="#800000">double</FONT> <FONT COLOR="#000080">gravidade</FONT>() { <B>return</B> G * _massa / (_raio * _raio);  }
 
 
 
    <I><FONT COLOR="#808080">// peso (N) de outra massa (kg) &agrave; superf&iacute;cie</FONT></I>
 
    <B>public</B> <FONT COLOR="#800000">double</FONT> <FONT COLOR="#000080">peso</FONT>(<FONT COLOR="#800000">double</FONT> massa) { <B>return</B> massa * <FONT COLOR="#000080">gravidade</FONT>(); }
 
  }
 
 
 
== Experiência 1 ==
 
  
 
=== Programa de Teste ===
 
=== Programa de Teste ===
 
+
<java5>
  <B>public</B> <B>class</B> Teste1 {
+
public class Teste1 {
    <B>public</B> <FONT COLOR="#800000">static</FONT> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">main</FONT>(<B><FONT COLOR="#0095ff">String</FONT></B>[] args) {
+
  public static void main(String[] args) {
      <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">&quot;** &quot;</FONT> + Esta&ccedil;&atilde;o.<FONT COLOR="#000080">PRIMAVERA</FONT>.<FONT COLOR="#000080">getClass</FONT>().<FONT COLOR="#000080">getCanonicalName</FONT>());
+
    System.out.println("** Estações");
      <B>for</B> (Esta&ccedil;&atilde;o e : Esta&ccedil;&atilde;o.<FONT COLOR="#000080">values</FONT>()) {
+
    for (Estação e : Estação.values())  
        <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(e);
+
      System.out.println(e);
      }
+
    System.out.println("** Planetas");
      <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">&quot;** &quot;</FONT> + Planeta.<FONT COLOR="#000080">MERC&Uacute;RIO</FONT>.<FONT COLOR="#000080">getClass</FONT>().<FONT COLOR="#000080">getCanonicalName</FONT>());
+
    for (Planeta p : Planeta.values())  
      <B>for</B> (Planeta p : Planeta.<FONT COLOR="#000080">values</FONT>()) {
+
      System.out.println(p);
        <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(p);
+
    // Planeta x = new Planeta(2.5e22, 2e6);  // erro: tipo não pode ser instanciado
      }
+
  }  
      <I><FONT COLOR="#808080">// Planeta x = new Planeta(2.5e22, 2e6);  // erro: tipo n&atilde;o pode ser instanciado</FONT></I>
+
}
    }  
+
</java5>
  }
 
  
 
=== Resultados ===
 
=== Resultados ===
Line 79: Line 80:
 
   PLUT&Atilde;O
 
   PLUT&Atilde;O
  
== Experiência 2 ==
+
== Experiência 2 ==
  
 
=== Programa de Teste ===
 
=== Programa de Teste ===
 
+
<java5>
  <B>public</B> <B>class</B> Teste2 {
+
public class Teste2 {
    <B>public</B> <FONT COLOR="#800000">static</FONT> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">main</FONT>(<B><FONT COLOR="#0095ff">String</FONT></B>[] args) {
+
  public static void main(String[] args) {
      <FONT COLOR="#800000">double</FONT> pesoNaTerra = <B><FONT COLOR="#0095ff">Double</FONT></B>.<FONT COLOR="#000080">parseDouble</FONT>(args[<FONT COLOR="#0000ff">0</FONT>]);
+
    double pesoNaTerra = Double.parseDouble(args[0]);
      <FONT COLOR="#800000">double</FONT> massa      = pesoNaTerra / Planeta.<FONT COLOR="#000080">TERRA</FONT>.<FONT COLOR="#000080">gravidade</FONT>();
+
    double massa      = pesoNaTerra / Planeta.TERRA.gravidade();
      <B>for</B> (Planeta p : Planeta.<FONT COLOR="#000080">values</FONT>()) {
+
    for (Planeta p : Planeta.values()) {
        <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out.printf</FONT>(<FONT COLOR="#dd0000">&quot;Peso em </FONT><FONT COLOR="#ff00ff">%s</FONT><FONT COLOR="#dd0000"> &eacute; </FONT><FONT COLOR="#ff00ff">%f%n</FONT><FONT COLOR="#dd0000">&quot;</FONT>, p, p.peso(massa));
+
      System.out.printf("Peso em %s é %f%n", p, p.peso(massa));
      }
+
    }
    }  
+
  }  
  }
+
}
 +
</java5>
  
 
=== Resultados ===
 
=== Resultados ===
Line 106: Line 108:
 
   Peso em PLUT&Atilde;O &eacute; 5.416831
 
   Peso em PLUT&Atilde;O &eacute; 5.416831
  
== Planetas: 2ª versão ==
+
== Planetas: versão ==
  
  <B>public</B> <B>enum</B> Planeta {
+
<java5>
    <FONT COLOR="#000080">MERC&Uacute;RIO</FONT> (<FONT COLOR="#800080">3.303e+23</FONT>, <FONT COLOR="#800080">2.4397e6</FONT>),
+
public class NoSurfaceException extends Exception {}
    <FONT COLOR="#000080">V&Eacute;NUS</FONT>   (<FONT COLOR="#800080">4.869e+24</FONT>, <FONT COLOR="#800080">6.0518e6</FONT>),
+
</java5>
    <FONT COLOR="#000080">TERRA</FONT>   (<FONT COLOR="#800080">5.976e+24</FONT>, <FONT COLOR="#800080">6.37814e6</FONT>),
+
<java5>
    <FONT COLOR="#000080">MARTE</FONT>   (<FONT COLOR="#800080">6.421e+23</FONT>, <FONT COLOR="#800080">3.3972e6</FONT>),
+
public enum Planeta {
    <FONT COLOR="#000080">J&Uacute;PITER</FONT> (<FONT COLOR="#800080">1.9e+27</FONT><FONT COLOR="#800080">7.1492e7</FONT>) { <B>public</B> <FONT COLOR="#800000">double</FONT> <FONT COLOR="#000080">peso</FONT>(<FONT COLOR="#800000">double</FONT> m) { <B>return</B> <FONT COLOR="#800080">0.0</FONT>; } },
+
  MERCÚRIO (3.303e+23, 2.4397e6),
    <FONT COLOR="#000080">SATURNO</FONT> (<FONT COLOR="#800080">5.688e+26</FONT>, <FONT COLOR="#800080">6.0268e7</FONT>) { <B>public</B> <FONT COLOR="#800000">double</FONT> <FONT COLOR="#000080">peso</FONT>(<FONT COLOR="#800000">double</FONT> m) { <B>return</B> <FONT COLOR="#800080">0.0</FONT>; } },
+
  VÉNUS   (4.869e+24, 6.0518e6),
    <FONT COLOR="#000080">URANO</FONT>   (<FONT COLOR="#800080">8.686e+25</FONT>, <FONT COLOR="#800080">2.5559e7</FONT>) { <B>public</B> <FONT COLOR="#800000">double</FONT> <FONT COLOR="#000080">peso</FONT>(<FONT COLOR="#800000">double</FONT> m) { <B>return</B> <FONT COLOR="#800080">0.0</FONT>; } },
+
  TERRA    (5.976e+24, 6.37814e6),
    <FONT COLOR="#000080">NEPTUNO</FONT> (<FONT COLOR="#800080">1.024e+26</FONT>, <FONT COLOR="#800080">2.4746e7</FONT>) { <B>public</B> <FONT COLOR="#800000">double</FONT> <FONT COLOR="#000080">peso</FONT>(<FONT COLOR="#800000">double</FONT> m) { <B>return</B> <FONT COLOR="#800080">0.0</FONT>; } },
+
  MARTE    (6.421e+23, 3.3972e6),
    <FONT COLOR="#000080">PLUT&Atilde;O</FONT>   (<FONT COLOR="#800080">1.27e+22</FONT><FONT COLOR="#800080">1.137e6</FONT>);
+
  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(); } },
    <I><FONT COLOR="#808080">// constante de gravita&ccedil;&atilde;o universal</FONT></I>
+
  URANO    (8.686e+25, 2.5559e7) { public double peso(double m) throws NoSurfaceException { throw new NoSurfaceException(); } },
    <B>public</B> <FONT COLOR="#800000">static</FONT> <FONT COLOR="#800000">final</FONT> <FONT COLOR="#800000">double</FONT> G = <FONT COLOR="#800080">6.67300E-11</FONT>; <I><FONT COLOR="#808080">// m&sup3;/kg/s&sup2;</FONT></I>
+
  NEPTUNO  (1.024e+26, 2.4746e7) { public double peso(double m) throws NoSurfaceException { throw new NoSurfaceException(); } },
 
+
  PLUTÃO   (1.27e+22,  1.137e6);
    <B>private</B> <FONT COLOR="#800000">double</FONT> _massa;  <I><FONT COLOR="#808080">// kg</FONT></I>
+
    <B>private</B> <FONT COLOR="#800000">double</FONT> _raio;  <I><FONT COLOR="#808080">// m</FONT></I>
+
  // constante de gravitação universal
 
+
  public static final double G = 6.67300E-11; // /kg/
    <B>public</B> <FONT COLOR="#800000">double</FONT> <FONT COLOR="#000080">massa</FONT>() { <B>return</B> _massa; }
+
    <B>public</B> <FONT COLOR="#800000">double</FONT> <FONT COLOR="#000080">raio</FONT>()  { <B>return</B> _raio;  }
+
  private double _massa;  // kg
 
+
  private double _raio;  // m
    <FONT COLOR="#000080">Planeta</FONT>(<FONT COLOR="#800000">double</FONT> massa, <FONT COLOR="#800000">double</FONT> raio) { _massa = massa; _raio  = raio; }
+
 
+
  public double massa() { return _massa; }
    <I><FONT COLOR="#808080">// gravidade &agrave; superf&iacute;cie</FONT></I>
+
  public double raio()  { return _raio;  }
    <B>public</B> <FONT COLOR="#800000">double</FONT> <FONT COLOR="#000080">gravidade</FONT>() { <B>return</B> G * _massa / (_raio * _raio); }
+
 
+
  Planeta(double massa, double raio) { _massa = massa; _raio  = raio; }
    <I><FONT COLOR="#808080">// peso (N) de outra massa (kg) &agrave; superf&iacute;cie</FONT></I>
+
    <B>public</B> <FONT COLOR="#800000">double</FONT> <FONT COLOR="#000080">peso</FONT>(<FONT COLOR="#800000">double</FONT> massa) { <B>return</B> massa * <FONT COLOR="#000080">gravidade</FONT>(); }
+
  // 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 ==
 
== Experiência 3 ==
Line 141: Line 148:
 
=== Programa de Teste ===
 
=== Programa de Teste ===
  
  <B>public</B> <B>class</B> Teste3 {
+
<java5>
    <B>public</B> <FONT COLOR="#800000">static</FONT> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">main</FONT>(<B><FONT COLOR="#0095ff">String</FONT></B>[] args) {
+
public class Teste3 {
      <FONT COLOR="#800000">double</FONT> pesoNaTerra = <B><FONT COLOR="#0095ff">Double</FONT></B>.<FONT COLOR="#000080">parseDouble</FONT>(args[<FONT COLOR="#0000ff">0</FONT>]);
+
  public static void main(String[] args) {
      <FONT COLOR="#800000">double</FONT> massa      = pesoNaTerra / Planeta.<FONT COLOR="#000080">TERRA</FONT>.<FONT COLOR="#000080">gravidade</FONT>();
+
    double pesoNaTerra = Double.parseDouble(args[0]);
      <B>for</B> (Planeta p : Planeta.<FONT COLOR="#000080">values</FONT>()) {
+
    double massa      = pesoNaTerra / Planeta.TERRA.gravidade();
        <FONT COLOR="#800000">double</FONT> peso = p.<FONT COLOR="#000080">peso</FONT>(massa);
+
    for (Planeta p : Planeta.values()) {
        <B>if</B> (peso != <FONT COLOR="#0000ff">0</FONT>) <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out.printf</FONT>(<FONT COLOR="#dd0000">&quot;Peso em </FONT><FONT COLOR="#ff00ff">%s</FONT><FONT COLOR="#dd0000"> &eacute; </FONT><FONT COLOR="#ff00ff">%f%n</FONT><FONT COLOR="#dd0000">&quot;</FONT>, p, peso);
+
      double peso;
        <B>else</B>          <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out.printf</FONT>(<FONT COLOR="#dd0000">&quot;Peso em </FONT><FONT COLOR="#ff00ff">%s</FONT><FONT COLOR="#dd0000"> &eacute; dif&iacute;cil de calcular</FONT><FONT COLOR="#ff00ff">%n</FONT><FONT COLOR="#dd0000">&quot;</FONT>, p);
+
      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 ===
 
=== Resultados ===
Line 166: Line 180:
 
   Peso em PLUT&Atilde;O &eacute; 5.416831
 
   Peso em PLUT&Atilde;O &eacute; 5.416831
  
Nesta listagem pode apreciar-se claramente a criação automática de classes anónimas para comportar a implementação do comportamento específico de cada instância.
+
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>
 
   <FONT COLOR="#800000"><B>$ ls</B></FONT>
   <B>Planeta.java</B> Planeta.class Planeta$1.class Planeta$2.class Planeta$3.class Planeta$4.class
+
   <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
 
   <B>Teste2.java</B> Teste2.class
 +
 +
[[category:Ensino]]
 +
[[category:PO]]
 +
[[category:PO Exemplos]]
 +
[[category:Java]]

Latest revision as of 20:24, 23 October 2013

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