Ho un caso in cui desidero utilizzare le enumerazioni come chiavi in alcune classi di impostazioni. Il database memorizzerà un valore stringa, permettendoci di cambiare le costanti enum senza dover udpare il database (un po 'brutto, lo so). Volevo lanciare un'eccezione di runtime nel costruttore di enum come modo per controllare la lunghezza dell'argomento della stringa per evitare di colpire il database e quindi ottenere una violazione del vincolo quando potevo facilmente rilevarlo da solo.
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;
}
}
Quando ho creato un test rapido per questo, ho trovato che l'eccezione generata non era mio, ma invece era un ExceptionInInitializerError.
Forse questo è stupido, ma penso che sia uno scenario abbastanza valido per voler generare un'eccezione in un inizializzatore statico.
fonte
2011-09-27 20:42:50
Perché vuoi farlo? Per me questo sembra un abuso del concetto di enum. I valori Enum dovrebbero essere costanti, la cui creazione non dipende da nulla. Anche se tecnicamente lo si potrebbe fare (lanciando un'eccezione non controllata invece di una selezionata), ti suggerirei di rivedere il tuo design. Se stai cercando di implementare un Singleton tramite questo enum, è meglio implementarlo a mano come una classe normale. –
Sto implementando un Singleton, ma come potrebbe essere implementato a mano come una classe normale essere meglio? Dovrei comunque lanciare un'eccezione dal codice chiamato da un inizializzatore statico. È possibile eseguire eccezioni non controllate da un costruttore enum. – tukushan
c'è qualcosa * icky * nell'ottenere un'eccezione generata semplicemente accedendo a un valore enum. Non così male quando si tratta di un metodo getInstance() singleton. –