Completando enumerados

En un post anterior, recomendaba almacenar un Integer en la base de datos y utilizar enumerados para gestionar los posibles valores a nivel programático.

En esta entrada, propongo otra forma de definir el enumerado para obtener el valor de forma más eficiente:

public enum EnumeradoEjemplo {
  VALOR1(1), VALOR2(2), VALOR3(3);

  private static final Map<Integer, EnumeradoEjemplo> ENUM_MAP;

  @Getter
  private Integer id;

  static {
    ENUM_MAP = new HashMap<>();
    for (EnumeradoEjemplo ejemplo : EnumeradoEjemplo.values()) {
      ENUM_MAP.put(ejemplo.getId(), ejemplo);
    }
  }

  EnumeradoEjemplo(Integer id) {
    this.id = id;
  }

  public Integer getId() {
    return id;
  }

  public static EnumeradoEjemplo valueOf(Integer id) {
    EnumeradoEjemplo ejemplo = ENUM_MAP.get(id);
    if (ejemplo == null)
      throw new IllegalArgumentException("No existe enumerado con valor: " + id);

    return ejemplo;
  }

}