Enumerados en Java




Una de las características que personalmente me agradan más en Java que en C# son los enumerados, los enumerados son una lista de ítems que son establecidos en algún momento en el código y después de haberse declarado son constantes.

Supongamos que tenemos una pizzería donde tenemos diferentes especialidades y tamaños, para ejemplificar nos enfocaremos en el tamaño de la pizza, se ofrecen 3 tamaños de pizza en la pizzería que son: personal, mediana, grande. Ahora crearemos la clase encargada de esta tarea.

package EnumTest;

public class PizzaEnum
{
 private String size;
 
 public PizzaEnum(String size)
 {
  this.size = size;
 }
 
 public String getSize()
 {
  return this.size;
 }
}

Y la clase encargada de ordenar una pizza

package EnumTest;

public class OrderPizza
{
 public static void main(String[] args)
 {
  PizzaEnum pizza = new PizzaEnum("Large");
  System.out.println("The pizza size is " + pizza.getSize());
 }
}


Este código funciona para nuestros propósitos, alguien ordena una pizza Grande, así que se crea el objeto pizza con el parámetro "Large" y obtenemos la pizza del tamaño que se ordeno. Sin embargo el código es propenso a errores debido a que nunca es validado el parámetro de entrada, con lo que se podría pedir una pizza de tamaño miniatura sin que esta existiera en nuestro menú.

En este caso podemos recurrir a los enumerados, establecer un número determinado de ítems (tamaños) y solo permitir la utilización de esos ítems en la creación de los objetos (pizzas). Cambiaremos la clase PizzaEnum para funcionar con un enumerado.

package EnumTest;

public class PizzaEnum
{
 private PizzaSize size;
 
 public PizzaEnum(PizzaSize size)
 {
  this.size = size;
 }
 
 public PizzaSize getSize()
 {
  return this.size;
 }
}

enum PizzaSize
{
 Personal,
 Medium,
 Large
}

Ahora al momento de ordenar una pizza, solo podemos utilizar los 3 tamaños de pizza declarados en nuestro enumerado, así evitaremos que se intente ordenar algún otro que no exista en el menú.

Hemos resuelto de forma elegante el problema, pero ahora tenemos otra dificultad se ordenan las pizzas de tamaños existentes pero cuando se cortan nunca se hacen con el mismo número de rebanadas, probablemente podríamos resolverlo con otro enumerado y una serie de validaciones extras para vincular el tamaño de la pizza con el número de rebanadas en que se corta, pero Java permite hacerlo de una forma más interesante.

Pensemos en el enumerado como si fuera una clase, entonces tenemos un constructor, atributos y métodos, pues es de esta manera como lo maneja Java, esto nos permite resolver el problema de una forma sencilla, en el constructor pasaremos como parámetro el número de rebanadas y expondremos este atributo para obtenerlo cuando sea necesario.

package EnumTest;

public class PizzaEnum
{
 private PizzaSize size;
 
 public PizzaEnum(PizzaSize size)
 {
  this.size = size;
 }
 
 public PizzaSize getSize()
 {
  return this.size;
 }
}

enum PizzaSize
{
 Personal(4), Medium(8), Large(16);
 
 PizzaSize(int slices)
 {
  this.slices = slices;
 }
 
 private int slices;
 public int getSlices()
 {
  return this.slices;
 }
}

El enumerado ha cambiado ahora además de los tres tamaños de pizza declarados anteriormente, hemos agregado dos paréntesis y un numero, un constructor con un parámetro de entrada, una variable "slices" de tipo entero y un método "getSlices". Ahora ordenemos una pizza mediana.

package EnumTest;

public class OrderPizza
{
 public static void main(String[] args)
 {
  PizzaEnum pizza = new PizzaEnum(PizzaSize.Medium);
  System.out.println("The pizza size is " + pizza.getSize());
  System.out.println("The number of slices cut is " + pizza.getSize().getSlices());
 }
} 

Como es que funciona, bueno primero que nada creamos una Pizza de tamaño mediano, es decir creamos un PizzaEnum con el parámetro de entrada PizzaSize.Medium, lo que sucede internamente al hacer esto es que se ejecuta el constructor del enumerado con el parámetro de entrada de PizzaSize.Medium es decir "8", y este asigna el valor pasado a la variable slices, ahora cuando se obtenga el numero de rebanadas siempre será el mismo para cada tamaño de pizza.




Ahora solo falta seguir jugando con los enumerados, por ejemplo intenta agregar siempre el mismo número de sobres de cátsup por cada pizza ordenada.

Happy Coding :D

1 comentario: