1.6 Declaración y uso de enum - ajpaez/OCA GitHub Wiki

(OCA Objective 1.2 and OCP Objective 2.5)

Declaración de enum

Los enum restringen el valor que contendrá una variable a unos pocos valores predefinidos. Ejemplo de declaración:

enum CoffeeSize { BIG, HUGE, OVERWHELMING };

No es requerido que las constantes del enum estén en mayúsculas, peo si recomendado por oracle. Pueden ser declaradas en su propia clase o en una clase separada, pero NUNCA dentro de un método. Cada uno de los enumerados será un objeto del tipo de la enumeración, así, BIG es de tipo CofeeSize. #Declaración de constructores, métodos y variables en un enum.

enum CoffeeSize {
    // 8, 10 & 16 are passed to the constructor
    BIG(8), HUGE(10), OVERWHELMING(16);
    CoffeeSize(int ounces) {    // constructor
      this.ounces = ounces;
    }
    private int ounces;         // an instance variable
    public int getOunces() {
      return ounces;
    }
}
class Coffee {
   CoffeeSize size;            // each instance of Coffee has an enum
   public static void main(String[] args) {
      Coffee drink1 = new Coffee();
      drink1.size = CoffeeSize.BIG;
      Coffee drink2 = new Coffee();
      drink2.size = CoffeeSize.OVERWHELMING;
      System.out.println(drink1.size.getOunces());  // prints 8
      for(CoffeeSize cs: CoffeeSize.values())
         System.out.println(cs + " " + cs.getOunces());
   }
}
  • No puedes NUNCA llamar al constructor de un enum directamente, es llamado automáticamente con el argumento definido en la constante.
  • Se pueden pasar mas de un argumento al constructor y sobrecargarlo.
  • NO pueden existir dos enum sin una clase

Y finalmente, puedes definir dentro de un unumerado una clase anónima interna, esta se conoce como cuerpo de clase especifica constnate Ejemplo en el que se necesita que OVERWHELMING sobreescriba el metodo getLidCode:

enum CoffeeSize {
     BIG(8),
     HUGE(10),
     OVERWHELMING(16) {               // start a code block that defines the "body" for this constant
       public String getLidCode() {   // override the method defined in CoffeeSize
         return "A";
       }
     };    // the semicolon is REQUIRED when more code follows
     CoffeeSize(int ounces) {
       this.ounces = ounces;
     }
    private int ounces;
    public int getOunces() {
      return ounces;
    }
    public String getLidCode() {     // this method is overridden by the OVERWHELMING constant
      return "B";                    // the default value we want to return for CoffeeSize constants
    }
}