JavaRush /Blog Java /Random-ES /Enum en Java: cómo usar la clase

Enum en Java: cómo usar la clase

Publicado en el grupo Random-ES
¡Hola! En este artículo te hablaré sobre las enumeraciones de Java. Imagina que te han asignado una tarea: crear una clase que implemente los días de la semana . A primera vista, no hay nada complicado en esto y su código se verá así:
public class DayOfWeek {

   private String title;

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

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

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
Y todo parece estar bien, pero hay un problema: puedes pasar cualquier texto al constructor de la clase DayOfWeek . De esta forma, alguien puede crear el día de la semana "Rana", "Nube" o "azaza322". Claramente, este no es el comportamiento que esperamos, porque solo hay 7 días reales de la semana y cada uno de ellos tiene un nombre. Por lo tanto, nuestra tarea es limitar de alguna manera el rango de valores posibles para la clase " día de la semana ". Antes de Java 1.5, los desarrolladores se veían obligados a encontrar una solución a este problema por su cuenta, ya que no existía una solución preparada en el propio lenguaje. En aquella época, si la situación requería un número limitado de valores, hacían esto:
public class DayOfWeek {

   private String title;

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

   public static DayOfWeek SUNDAY = new DayOfWeek("Domingo");
   public static DayOfWeek MONDAY = new DayOfWeek("Lunes");
   public static DayOfWeek TUESDAY = new DayOfWeek("Martes");
   public static DayOfWeek WEDNESDAY = new DayOfWeek("Miércoles");
   public static DayOfWeek THURSDAY = new DayOfWeek("Jueves");
   public static DayOfWeek FRIDAY = new DayOfWeek("Viernes");
   public static DayOfWeek SATURDAY = new DayOfWeek("Sábado");

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
A qué debes prestar atención aquí:
  • Constructor privado. Si un constructor está marcado con el modificador privado , no se puede crear un objeto de la clase usando ese constructor. Y como sólo hay un constructor en esta clase, el objeto DayOfWeek no se puede crear en absoluto.

    public class Main {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = new DayOfWeek();//¡error!
       		}
    }
  • Al mismo tiempo, la clase contenía la cantidad requerida de objetos estáticos públicos que se inicializaron de la manera que necesitábamos (los nombres de los días son correctos).

    Esto hizo posible utilizar objetos en otras clases.

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

    Conclusión:

    DíaDeLa Semana{título='Domingo'}

Este enfoque nos permitió en gran medida resolver el problema. Teníamos 7 días de la semana a nuestra disposición y nadie podía crear otros nuevos. Esta solución fue propuesta por Joshua Bloch en el libro Effective Java . El libro, por cierto, es muy interesante y una lectura obligada para cualquier desarrollador de Java.
Cómo utilizar la clase Enum - 2
Con el lanzamiento de Java 1.5, el lenguaje introdujo una solución lista para usar para tales situaciones: la enumeración Enum . Enum también es una clase. Pero está especialmente “adaptado” para resolver problemas similares al nuestro: la creación de una cierta gama limitada de valores. Dado que los creadores de Java ya tenían ejemplos preparados (digamos, el lenguaje C, en el que ya existía Enum ), pudieron crear la opción óptima.

¿Qué es la enumeración?

Entonces, ¿qué es Enum en Java ? Veamos el ejemplo del mismo DayOfWeek :
public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Ya parece mucho más simple :) Dentro de nuestro Enum hay 7 constantes con acceso estático. Ya podemos usarlo para implementar lógica en el programa. Por ejemplo, escribamos un programa que determine si un estudiante necesita ir a la escuela hoy. Nuestro estudiante tendrá su propia rutina diaria, designada por la clase ScholarSchedule :
public class ScholarSchedule {

   private DayOfWeek dayOfWeek;
   //...otros campos


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
La variable dayOfWeek en modo día determina qué día es. Y aquí está la clase de nuestro estudiante:
public class Scholar {

   private ScholarSchedule schedule;
   private boolean goToSchool;

   public void wakeUp() {

       if (this.schedule.getDayOfWeek() == DayOfWeek.SUNDAY) {
           System.out.println("¡Hurra, puedes dormir un poco más!");
       } else {
           System.out.println("Maldita sea, de vuelta a la escuela :(");
       }
   }
}
En el método wakeUp() , usando Enum, determinamos las acciones futuras del estudiante. Ni siquiera describimos en detalle qué significa cada variable en DayOfWeek , y esto no es necesario: el mecanismo de los días de la semana ya es obvio, y si lo usamos en su forma actual, cualquier desarrollador entenderá qué está sucediendo en su código. Otro ejemplo de la conveniencia de Enum es que sus constantes se pueden usar con una declaración de cambio . Por ejemplo, estamos escribiendo un programa para una dieta estricta, en el que las comidas se programan por día:
public class VeryStrictDiet {
   public void takeLunch(DayOfWeek dayOfWeek) {
       switch (dayOfWeek) {
           case SUNDAY:
               System.out.println("¡Almuerzo de domingo! Hoy puedes incluso comer un poco de dulce");
               break;
           case MONDAY:
               System.out.println("Almuerzo del lunes: ¡Fideos con pollo!");
               break;
           case TUESDAY:
               System.out.println("Martes, hoy toca sopa de apio :(");
               break;
               //...y así sucesivamente hasta el final
       }
   }
}
Esta es una de las ventajas de Enum 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 necesitas saber sobre la clase Enum?

La clase Enum es una clase real con todas las capacidades que la acompañan. Por ejemplo, si la implementación actual de los días de la semana no es suficiente para usted, puede agregar variables, constructores y métodos a DayOfWeek :
public enum DayOfWeek {

   SUNDAY ("Domingo"),
   MONDAY ("Lunes"),
   TUESDAY ("Martes"),
   WEDNESDAY ("Miércoles"),
   THURSDAY ("Jueves"),
   FRIDAY ("Viernes"),
   SATURDAY ("Sábado");

   private String title;

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

   public String getTitle() {
       return title;
   }

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
Las constantes de nuestra enumeración ahora tienen un campo de título , un captador y un método toString anulado . En comparación con las clases normales, Enum tiene una limitación importante: no se puede heredar. Además, las enumeraciones tienen métodos exclusivos para ellas:
  • valores() : devuelve una matriz de todos los valores almacenados en Enum :

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

    Conclusión:

    [Día de la semana{título='domingo'}, Día de la semana{título='lunes'}, Día de la semana{título='martes'}, Día de la semana{título='miércoles'}, Día de la semana{título='jueves'}, Día de la semana{título= 'Viernes'}, DíaDeLa Semana{título='Sábado'}]

  • ordinal() : devuelve el número ordinal de una constante. La cuenta atrás comienza desde cero:

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

    Conclusión:

    0

  • valueOf() : Devuelve un objeto Enum correspondiente al nombre dado:

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

    Conclusión:

    DíaDeLa Semana{título='Domingo'}

Prestar atención:Escribimos en mayúscula los nombres de los elementos Enum porque son constantes y están designados como tales, no camelCase .
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION