Esta semana vamos a introducir un nuevo concepto de programación, los tipos enumerados. Son muy sencillos y no necesitan mucha explicación. Eso sí, son un ejemplo fantástico del patrón singleton, y resuelven muchos problemas en la vida real TM.
Recomiendo leer el capítulo 18 "Enum Types" del Libro Beginning Java 8 Fundamentals. Se explican a través de un par de ejercicios que recomiendo ir codificando en vuestro editor favorito IntelIJ throws FileNotSupportedException
Además, vamos a prácticar TDD:
- He incluido los casos test que ha de pasar vuestro código.
- He incluido el programa principal.
De esta manera, nos aseguramos que aprendéis todo lo que es necesario saber sobre tipos enumerados, y aprendéis las fluent assertions, que harán vuestros casos test más optimos.
Se trata de calcular el peso de una persona en los distintos planetas de nuestro Sistema Solar1, al estilo de este sitio web:
http://www.traducimos.cl/planet/
Es importante evitar que os suceda lo de Arnold en Desafio Total2 cuando salió a dar un paseíto por la superficie marciana, estando de cuarentena como estábamos en marzo de 2019:
El peso en otro planeta se lo preguntáis a vuestros compañeros que han estudiado Física en la universidad o bachiller (call @Arturo @JoanNicolau y cia). Si no se lo saben de memoria, aplicad este sencilla fórmula:
donde:
donde:
y
Los valores de masa y radio de cada planeta (en
MERCURY (3.303e+23, 2.4397e6),
VENUS (4.869e+24, 6.0518e6),
EARTH (5.976e+24, 6.37814e6),
MARS (6.421e+23, 3.3972e6),
JUPITER (1.9e+27, 7.1492e7),
SATURN (5.688e+26, 6.0268e7),
URANUS (8.686e+25, 2.5559e7),
NEPTUNE (1.024e+26, 2.4746e7);
Si completas la función main
para recoger argumentos desde línea de comandos, la salida del programa en consola podría ser esta, donde 175
es tu peso en la Tierra:
$ java Planet 175
Your weight on MERCURY is 66.107583
Your weight on VENUS is 158.374842
Your weight on EARTH is 175.000000
Your weight on MARS is 66.279007
Your weight on JUPITER is 442.847567
Your weight on SATURN is 186.552719
Your weight on URANUS is 158.397260
Your weight on NEPTUNE is 199.207413
Estos son los casos test que ha de satisfacer tu código: /src/test/java/org/foobarspam/arnoldEnumType/test/ArnoldEnumTypeTest.java
Utilízalos para practicar TDD y que te guíen en el diseño del código.
Para utilizar estos casos test, has de incluir en el POM.xml
del proyecto Maven o en el fichero build.gradle
una dependencia adecuada a la librería de AssertJ. Búscala en el repo de Maven:
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>[3.22.0,)</version>
<scope>test</scope>
</dependency>
¿Cómo funcionan las Fluent Assertions?:
AssertJ - fluent assertions java library
Estas son las funciones de la API de los tipos enumerados. Asegúrate de que entiendes su comportamiento y el tipo de dato que devuelven.
@Test
public void PlanetaConstructorTest() {
// me aseguro de que los metodos de la api
// de los Enum Types se comportan como espero
Planeta planeta = Planeta.MERCURY;
assertThat(planeta).isInstanceOf(Planeta.class);
assertThat(planeta.ordinal()).isZero();
assertThat(planeta.name()).isEqualToIgnoringCase("MERCURY");
assertThat(Planeta.valueOf(planeta.name())).isEqualTo(Planeta.MERCURY);
assertThat(planeta.compareTo(Planeta.MERCURY)).isZero();
assertThat(planeta.toString()).isEqualToIgnoringCase("MERCURY");
assertThat(planeta.equals(Planeta.MERCURY)).isTrue();
assertThat(Planeta.values()[0]).isEqualTo(planeta);
}
Programa la lógica para que, además de los casos test, satisfaga el script principal del programa: ArnoldMain.java
Resuelto por mi: Planeta.java
Resuelto por Oracle: Enum Types, the Java Tutorials