Java – Enumeraciones avanzadas

Como en otros lenguajes de programación, una enum o un tipo enum en Java es una variable que puede tener un conjunto de constantes predefinidas.

¿Y para qué me sirve eso?

Pongamos el siguiente ejemplo,  nosotros necesitamos representar el valor de los días de la semana, podríamos lograrlo utilizando constantes y variables int de la siguiente manera:

Imagen

¿Hasta aquí todo bien, pero qué pasaría si alguien hiciera esto?

Imagen

¿Cuál debe ser el valor de sumar DOMINGO + SABADO?

Simplemente no tiene lógica ni significado, nosotros necesitamos de una variable que almacene un solo valor y ¡SOLO ESE VALOR!

Para eso nos viene perfecta una enumeración, esta es la sintaxis en Java:

Imagen

enum + Identificador + CONSTANTES

Y la asignación la podemos hacer así:

Imagen

Y solamente así, debido a  que los constructores en los enums son privados, por lo tanto es un error de compilación usar new para intentar hacer una instancia de una enum primitiva.

Los enums pueden tener métodos

Las enums pueden tener métodos, no solo nos sirven para representar un tipo o un número ordinal, podemos tener algo así:

Imagen

Y podemos invocar ese método así:

Imagen

Ó así:

Imagen

Los enums pueden tener constructores y variables de instancia, ejemplo:

Imagen

Cuando haces:

Imagen

Internamente el enum asocia esa constante a su constructor:

Imagen

Es decir, pasa ese 1 que está en la constante dentro del enum a su constructor.

Podemos pasar lo que necesitemos, un ejemplo (sin utilidad) es el siguiente:

Imagen

En este ejemplo hemos utilizado ya una referencia y no una variable primitiva.

Comportamiento específico para cada constante

En ocasiones podemos necesitar que cuando se invoque a una constante se invoque a un método específico para esa constante, es por esto que las enumeraciones brindan la posibilidad de incluír métodos abstractos para que dentro de cada constante tengas que sobreescribir ese método y dar un comportamiento específico, veamos un ejemplo:

Imagen

Como se puede observar hemos declarado un método abstracto llamado getRGB que regresa un array de ints, al hacer esto estamos obligados a dar una implementación en el bloque de cada constante.

Podemos utilizarlo así:

Imagen

A continuación alguna de las reglas que tienen las enumeraciones:

  • No se pueden hacer operaciones aritméticas entre enumeraciones, a menor que sea entre los métodos internos de la enumeración, ejemplo:Imagen
  • Todas las enumeraciones extienden de la clase Enum, pueden consultar el API para ver otros métodos interesantes aparte del ordinal().
  • Dentro de cada bloque de las constantes podemos tener n cantidad de métodos, pero solo los que estén sobrescribiendo los métodos abstractos tendrán visibilidad fuera de la enumeración.
  • Las enumeración son otro tipo de variable que puede utilizarse en un switch.
  • Las enumeraciones al igual que las clases pueden estar en archivos separados y aplican las mismas reglas de modificadores de acceso que para las clases.
  • Los constructores de una enumeración siempre son privados, SIEMPRE, es un error intentar hacer esto:
  • Imagen
  • Las enumeraciones ya implementan el método toString().
  • Las enumeraciones pueden tener variables de instancia tal como las clases.
  • Pueden utilizar el método values() para obtener las constantes de la enumeración.

Eso es todo, espero les sea de utilidad, cualquier comentario es bien recibido.

¡Saludos!

Anuncios

Acerca de leonardogtzr

Programmer ...
Esta entrada fue publicada en Programación y etiquetada , , , , , , . Guarda el enlace permanente.

2 respuestas a Java – Enumeraciones avanzadas

  1. joanpaon dijo:

    Hola.

    Interesante trabajo.

    Solo una cosita, como lo has planteado al principio no hay ningún problema con:

    final int SABADO = 5;
    final int DOMINGO = 6;
    int dia = SABADO + DOMINGO;

    La variable dia tendria un bonito 11.

    Felicidades por lo demás.

    Saludos.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s