Programación 3

Universidad de Alicante, 2023–2024

Tipos Enumerados en Java

Son clases que heredan de java.lang.Enum. Las constantes enum son en realidad instancias (es decir, objetos).

enum Color {
  none, black, silver
}

Color c = Color.black;

Método toString()

System.out.println(c); // equivale a System.out.println(c.toString());

Métodos equals, compareTo()

if ( c.equals(Color.silver) ) ...
if ( c == Color.silver ) ...

c.compareTo(Color.black) --> 0
c.compareTo(Color.silver) --> -1
c.compareTo(Color.none) --> 1

Otros métodos

  • ordinal() – devuelve el entero asignado por Java al valor del enum.

  • static values() – genera un array con los valores

for (Color c : Color.values()) ...
  System.out.println(c.ordinal()); // comenzando en cero
  • static valueOf(String)
Color c = Color.valueOf("black");

Sentencias switch

Los enums pueden usarse en los switch.

switch(c) {
  case none: ...
  case black: ...
}

Incluir tipos enumerados

import static modelo.Color.*;

no hace falta cualificar las constantes enum para usarlas.

Color c = black;

Más sobre enums

Los tipos enumerados no se pueden instanciar. Supongamos que tenemos

enum Color { azul, rojo, verde }

Los únicos objetos de tipo Color que existen son Color.azul, Color.rojo, Color.verde, que son estáticos. Es similar a crear una clase llamada Color con un constructor privado, que contiene tres objetos (de tipo Color), estáticos:

class Color {
  public static Color azul = new Color(1);
  public static Color rojo = new Color(2);
  public static Color verde = new Color(3);

  private int valor;
  private Color(int a) { valor = a; }
}

Volviendo al tipo enum Color:

Color c = new Color(azul); // da error de compilación. No se pueden instanciar enums

Color c = Color.azul; // Ok, referencia a objeto estático Color.azul
Color d = Color.azul; // ya tengo dos referencias a Color.azul

Asignación de valores asociados a una constante enum

enum Color {
  azul("AZUL",1), rojo("ROJO",2), verde("VERDE",3);

  private int valor;
  private String nombre;

  // Constructor privado por definición
  Color(String s, int val) { nombre = s; valor = val; }

  @Override
  String toString() { return nombre; }
}

Esto permite asociar atributos a los objetos tipo enum.

Los tipos enumerados son mutables

Supongamos que ahora añadimos un par getter/setter:

public void setValor(int a) { valor = a; }
public int getValor() { return valor; }

Entonces:

    Color e = Color.rojo;
    e.set(4); // los objetos enum son mutables
    System.out.println(e); // ROJO
    System.out.println(e.get()); // 4

En resumen

Las constantes enum en Java son objetos estáticos y mutables del tipo enum definido.

Normalmente los enum se usan como objetos inmutables (lo son si no se añade algún tipo de setter como en el caso anterior).