CodeGym /Blog Java /Random-ES /Clase de enumeración en Java
Autor
Milan Vucic
Programming Tutor at Codementor.io

Clase de enumeración en Java

Publicado en el grupo Random-ES
¡Hola! En este artículo, le hablaremos sobre Java Enums . Imagina que te han dado la siguiente tarea: crea una clase que implemente los días de la semana . A primera vista, esto parece bastante sencillo. Su código sería algo como esto:

public class DayOfWeek {

   private String title;

   public DayOfWeek(String title) {
       this.title = title;
   }

   public static void main(String[] args) {
       DayOfWeek dayOfWeek = new DayOfWeek("Saturday");
       System.out.println(dayOfWeek);
   }

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
Todo parece estar bien, pero hay un problema: puedes pasar cualquier texto al constructor de la clase DayOfWeek . Eso significa que alguien podría crear un día de la semana llamado "Rana", "Nube" o "azaza322". Claramente, este no es el comportamiento que esperamos, ya que solo hay 7 días reales de la semana, y cada uno de ellos tiene un nombre específico. Por lo tanto, nuestra tarea es limitar de alguna manera el rango de valores posibles para la clase DayOfWeek . Antes de que apareciera Java 1.5, los desarrolladores tenían que inventar de forma independiente sus propias soluciones a este problema, ya que el lenguaje no tenía una solución preparada. En aquellos días, si los programadores necesitaban limitar el número de valores, hacían esto:

public class DayOfWeek {

   private String title;

   private DayOfWeek(String title) {
       this.title = title;
   }

   public static DayOfWeek SUNDAY = new DayOfWeek("Sunday");
   public static DayOfWeek MONDAY = new DayOfWeek("Monday");
   public static DayOfWeek TUESDAY = new DayOfWeek("Tuesday");
   public static DayOfWeek WEDNESDAY = new DayOfWeek("Wednesday");
   public static DayOfWeek THURSDAY = new DayOfWeek("Thursday");
   public static DayOfWeek FRIDAY = new DayOfWeek("Friday");
   public static DayOfWeek SATURDAY = new DayOfWeek("Saturday");

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
Esto es lo que debe notar:
  • El constructor es privado. Si un constructor está marcado con el modificador privado , no se puede usar para crear un objeto. Y dado que la clase tiene solo un constructor, nunca se pueden crear objetos DayOfWeek .

    
    	public class Main {
    
       		public static void main(String[] args) {
          
           			DayOfWeek sunday = new DayOfWeek(); // Error!
       		}
    }
    

  • Por supuesto, la clase tiene la cantidad requerida de objetos estáticos públicos , que se inicializaron correctamente (usando los nombres correctos de los días de la semana).

    Esto permitió que estos objetos se usaran en otras clases.

    
    	public class Person {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = DayOfWeek.SUNDAY;
    
           			System.out.println(sunday);
      		 }
    }
    

    Producción:

    DíaDeLaSemana{título = 'Domingo'}

Este enfoque resuelve en gran medida el problema. Tenemos 7 días de la semana a nuestra disposición, y nadie puede crear nuevos. Esta solución fue ofrecida por Joshua Bloch en su libro Java efectivo . Por cierto, ese libro es genial y una lectura obligada para cualquier desarrollador de Java. Cómo usar la clase Enum - 2Con el lanzamiento de Java 1.5, el lenguaje obtuvo una solución preparada para tales situaciones: Java Enums . Enum en Java también es una clase. Está especialmente "afinado" para resolver problemas como este, es decir, creando un cierto rango limitado de valores. Los creadores de Java ya tenían ejemplos listos (por ejemplo, C ya tenía enum ), por lo que pudieron crear la mejor variante.

Entonces, ¿qué es Java Enum?

Revisemos nuestro ejemplo de DayOfWeek :

public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Ahora eso parece mucho más simple :) Internamente, nuestro Enum tiene 7 constantes estáticas. Y eso es algo que podemos usar para implementar un programa. Por ejemplo, escribamos un programa que determine si un estudiante necesita ir a la escuela hoy. Nuestro estudiante tendrá un horario diario, representado por la clase StudentSchedule :

public class StudentSchedule {

   private DayOfWeek dayOfWeek;
   // ... other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
La variable dayOfWeek del objeto de programación determina qué día es hoy. Y aquí está nuestra clase de estudiantes:

public class Student {

   private StudentSchedule schedule;
   private boolean goToSchool;

   public void wakeUp() {
      
       if (this.schedule.getDayOfWeek() == DayOfWeek.SUNDAY) {
           System.out.println("Hooray, you can sleep more!");
       } else {
           System.out.println("Damn, time for school again :(");
       }
   }
}
En el método wakeUp() , usamos Java Enum para determinar qué debe hacer el estudiante a continuación. Ni siquiera proporcionamos detalles sobre cada campo en DayOfWeek y no es necesario: es obvio cómo se supone que funcionan los días de la semana. Si lo usamos en su forma actual, cualquier desarrollador entendería lo que está pasando en nuestro código. Otro ejemplo de la conveniencia de Enum es que sus constantes se pueden usar con la instrucción switch. Por ejemplo, escribamos un programa para una dieta estricta, en el que los platos se programan por día:

public class VeryStrictDiet {
   public void takeLunch(DayOfWeek dayOfWeek) {
       switch (dayOfWeek) {
           case SUNDAY:
               System.out.println("Sunday Dinner! You can even enjoy something a little sweet today.");
               break;
           case MONDAY:
               System.out.println("Lunch for Monday: chicken noodle soup!");
               break;
           case TUESDAY:
               System.out.println("Tuesday, today it's celery soup :(");
               break;
               //... and so on to the end
       }
   }
}
Esta es una de las ventajas de Enums sobre la solución anterior que se usaba antes de Java 1.5: la solución anterior no se podía usar con switch . ¿Qué más necesita saber sobre Enum ? Enum es una clase real con todas las posibilidades que esto conlleva. Por ejemplo, si la implementación actual de los días de la semana es inadecuada, puede agregar variables, constructores y métodos a DayOfWeek :

public enum DayOfWeek {
  
   SUNDAY ("Sunday"),
   MONDAY ("Monday"),
   TUESDAY ("Tuesday"),
   WEDNESDAY ("Wednesday"),
   THURSDAY ("Thursday"),
   FRIDAY ("Friday"),
   SATURDAY ("Saturday");

   private String title;

   DayOfWeek(String title) {
       this.title = title;
   }

   public String getTitle() {
       return title;
   }

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
Ahora nuestras constantes Enum tienen un campo de título , un captador y un método toString anulado . En comparación con las clases regulares, se colocó una seria limitación en Enum : no se puede heredar. Además, las enumeraciones tienen métodos característicos:
  • valores () : devuelve una matriz de todos los valores en el Enum :

    
    public static void main(String[] args) {
       		System.out.println(Arrays.toString(DayOfWeek.values()));
    }
    

    Producción:

    [DayOfWeek{título = 'Domingo'}, DayOfWeek{título = 'Lunes'}, DayOfWeek{título = 'Martes'}, DayOfWeek{título = 'Miércoles'}, DayOfWeek{título = 'Jueves'}, DayOfWeek{título = 'Viernes'}, DíaDeLaSemana{title = 'Sábado'}]

  • ordinal() : devuelve el número ordinal de la constante. La numeración comienza desde cero:

    
    	public static void main(String[] args) {
    
       		int sundayIndex = DayOfWeek.SUNDAY.ordinal();
       		System.out.println(sundayIndex);
    }
    

    Producción:

    0

  • valueOf() : devuelve el objeto Enum que corresponde al nombre pasado:

    
    public static void main(String[] args) {
       DayOfWeek sunday = DayOfWeek.valueOf("SUNDAY");
       System.out.println(sunday);
    }
    

    Producción:

    DíaDeLaSemana{título = 'Domingo'}

Nota:usamos letras mayúsculas para especificar campos Enum . Estas son constantes, por lo que usan mayúsculas en lugar de camelCase .
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION