Mam przypadek, w którym chcę używać wyrażeń jako kluczy w niektórych ustawieniach klas. Baza danych będzie przechowywać wartość ciągu, co pozwoli nam zmienić stałe wyliczeniowe bez konieczności udpate bazy danych (trochę brzydki, wiem). Chciałem rzucić wyjątek runtime w konstruktorze enum jako sposób na kontrolowanie długości argumentu string, aby uniknąć trafienia w bazę danych, a następnie uzyskanie naruszenia ograniczeń, gdybym mógł go łatwo wykryć.
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;
}
}
Kiedy stworzyliśmy szybki test na to, uważam, że wyjątek rzucony nie był mój, ale zamiast tego był ExceptionInInitializerError.
Może to głupie, ale myślę, że jest to dość poprawny scenariusz dla chcącego rzucić wyjątek w statycznym inicjalizatorze.
Dlaczego chcesz to zrobić? Dla mnie to brzmi jak nadużycie koncepcji enum. Wartości enum mają być stałymi, których tworzenie nie jest zależne od niczego. Nawet jeśli z technicznego punktu widzenia mógłbyś to zrobić (rzucając niesprawdzony wyjątek zamiast sprawdzonego), sugerowałbym zmianę twojego projektu. Jeśli próbujesz zaimplementować Singleton za pomocą tego wyliczenia, lepiej jest zaimplementować go ręcznie jako normalną klasę. –
Wdrażam Singleton, ale w jaki sposób wdrożenie go ręcznie jako normalnej klasy byłoby lepsze? Nadal musiałbym rzucić wyjątek od kodu wywoływanego przez statyczny inicjator. Możesz rzucić niezaznaczone wyjątki z konstruktora wyliczeniowego. – tukushan
Jest coś * złośliwego * na temat wyrzucania wyjątku, jedynie przez uzyskanie dostępu do wartości wyliczeniowej. Nie tak źle, gdy jest to metoda singleton getInstance(). –