Programación Avanzada

Polimorfismo y sobrecarga

Enumeraciones

Introducción

Las enumeraciones en Java nos permiten definir listas de elementos, cada uno de los cuales se identifica por su posición.

Además de este comportamiento básico, las enumeraciones de Java pueden definir métodos y atributos, lo que las hace muy flexibles a la hora de definir, por ejemplo, las distintas opciones que pueden aparecer en un menú.

Bibliografía

Contenidos

  1. Un ejemplo sencillo con enumeraciones.
  2. Las enumeraciones extienden implícitamente a la clase Enum.
  3. Las enumeraciones son ricas.
  4. Las enumeraciones pueden implementar interfaces.
  5. Resumen.

Un ejemplo sencillo

El ejemplo siguiente muestra cómo definir las distintas opciones de un menú para un cajero automático:

public enum OpcionesMenu {
    RETIRAR_EFECTIVO,
    CONSULTA_SALDO,
    RECARGAR_TARJETA,
    REALIZAR_TRANSFERENCIA;
}

Cada elemento de la enumeración posee un ordinal:

  • 0 RETIRAR_EFECTIVO.
  • 1 CONSULTA_SALDO.
  • 2 RECARGAR_TARJETA.
  • 3 REALIZAR_TRANSFERENCIA.

Un ejemplo sencillo

De modo que el ordinal lo podemos utilizar para filtrar un elemento de la enumeración en un switch:

OpcionesMenu opcion = OpcionesMenu.CONSULTA_SALDO;
switch(opcion) {
    case CONSULTA_SALDO:
        consultaSaldo();
        break;
    case REALIZAR_TRANSFERENCIA:
        realizarTransferencia();
        break;
        ....
}

Ahora puedo cambiar el orden en los elementos de la enumeración, o puedo añadir nuevos elementos en cualquier posición dentro de la enumeración, el código anterior sigue funcionando.

La clase Enum

Al definir una enumeración, implícitamente se está extendiendo a la clase java.lang.Enum. Por ello, tenemos disponible todos los métodos definidos en ella, por ejemplo:

values() Devuelve un array con todos los elementos de la enumeración.

ordinal() Devuelve el orden del elemento dentro de la enumeración.

name() Devuelve el nombre del elemento.

El efecto colateral de extender implícitamente a Enum es que una enumeración no puede extender a ninguna clase.

Las enumeraciones son ricas

Las enumeraciones pueden definir atributos y métodos:

public enum OpcionesMenu {
    RETIRAR_EFECTIVO("Retirar dinero en efectivo."),
    CONSULTA_SALDO("Consultar el saldo de su cuenta."),
    RECARGAR_TARJETA("Recargar su tarjeta de débito."),
    REALIZAR_TRANSFERENCIA("Realizar una transferencia");
    
    private String descripcion;
    
    private OpcionesMenu(String descripcion) {
        this.descripcion = descripcion;
    }
    
    public String getDescripcion() {
        return descripcion;
    }
}

Las enumeraciones son ricas

En el ejemplo anterior, cada vez que se crea un elemento de la enumeración, se le pasa un String en el constructor que se almacena en el atributo String descripcion.

OpcionesMenu opcion = OpcionesMenu.CONSULTAR_SALDO;
System.out.println(opcion.getDescripcion());

Mostrará: Consultar el saldo de su cuenta.

Las enumeraciones son ricas

Por comodidad, podemos añadirle un par de métodos más a nuestra enumeración.

public static OpcionesMenu getOpcion(int posicion) {
    return values()[posicion];
}

public static String getMenu() {
    StringBuilder sb = new StringBuilder();
    for(OpcionesMenu opcion: OpcionesMenu.values()) {
        sb.append(opcion.ordinal());
        sb.append(".- ");
        sb.append(opcion.getDescripcion());
        sb.append("\n");
    }
    return sb.toString();
}

Las enumeraciones son ricas

Ahora, podríamos mostrar el menú con nuestras opciones, y pedir al usuario que eligiese una de este modo:

System.out.println(OpcionesMenu.getMenu());
Scanner scanner = new Scanner(System.in);
System.out.print("Elije una opción:");
byte opcion = scanner.nextByte();
OpcionesMenu opcionMenu = OpcionesMenu.getOpcion(opcion);
switch(opcionMenu) {...

0.- Retirar dinero en efectivo.
1.- Consultar el saldo de su cuenta.
2.- Recargar su tarjeta de débito.
3.- Realizar una transferencia.
Elige una opción:1
...

Las enumeraciones pueden implementar interfaces

Una enumeración no puede extender a ninguna clase, pero puede implementar todos los interface que necesite:

public enum OpcionesMenu implements ProporcionaDescripcion {
    RETIRAR_EFECTIVO("Retirar dinero en efectivo."),
    CONSULTA_SALDO("Consultar el saldo de su cuenta."),
    RECARGAR_TARJETA("Recargar su tarjeta de débito."),
    REALIZAR_TRANSFERENCIA("Realizar una transferencia");
    ...

Donde el interface es:

public interface ProporcionaDescripcion {
    String getDescripcion();
}

Resumen

Las enumeraciones nos sirven para definir elementos con un orden entre ellos bajo un tipo común.

Para definir una enumeración utilizamos la palabra reservada enum.

Una enumeración implícitamente extiende a la clase java.lang.Enum, luego explícitamente no puede extender a ninguna otra clase.

Una enumeración puede definir atributos y métodos, lo que las hace bastante ricas.

Una enumeración puede implementar todos los interface que necesite.