Tengo un caso en el que quiero utilizar enumeraciones como claves en algunas clases de configuración. La base de datos almacenará un valor de cadena, lo que nos permite cambiar las constantes enum sin tener que udpatear la base de datos (un poco feo, lo sé). Quería lanzar una excepción de tiempo de ejecución en el constructor de la enumeración como una forma de vigilar la longitud del argumento de cadena para evitar golpear la base de datos y luego obtener una violación de restricción cuando podía detectarla yo mismo.
public enum GlobalSettingKey {
EXAMPLE("example");
private String value;
private GlobalSettingKey(String value) {
if (value.length() > 200) {
throw new IllegalArgumentException("you can't do that");
}
this.value = value;
}
@Override
public String toString() {
return value;
}
}
Cuando creé una prueba rápida para esto, me encontré con que la excepción lanzada no era mío, sino que fue un ExceptionInInitializerError.
Tal vez esto es tonto, pero creo que es un escenario bastante válido para querer lanzar una excepción en un inicializador estático.
¿Por qué querrías hacer eso? Para mí esto suena como un abuso del concepto enum. Se supone que los valores de Enum son constantes, cuya creación no depende de nada. Incluso si técnicamente pudieras hacerlo (lanzando una excepción sin marcar en lugar de una marcada), te sugiero que revises tu diseño. Si está intentando implementar un Singleton a través de esta enumeración, es mejor implementarlo a mano como una clase normal. –
Estoy implementando un Singleton, pero ¿cómo sería mejor implementarlo a mano como una clase normal? Todavía tendría que arrojar una excepción del código invocado por un inicializador estático. Puede lanzar excepciones sin marcar desde un constructor enum. – tukushan
hay algo * icky * sobre cómo obtener una excepción simplemente accediendo a un valor enum. No tan mal cuando se trata de un método singleton getInstance(). –