Podczas pracy ze zmiennymi / parametrami, które mogą przyjmować tylko skończoną liczbę wartości, staram się zawsze używać języka Java enum
, tak jak w
public enum BonusType {
MONTHLY, YEARLY, ONE_OFF
}
Tak długo, jak pozostaję w swoim kodzie, działa dobrze. Jednak często muszę łączyć się z innym kodem, który używa zwykłych int
(lub String
) wartości do tego samego celu, lub muszę czytać / zapisywać z / do bazy danych, w której dane są przechowywane jako liczba lub ciąg.
W takim przypadku chciałbym mieć wygodny sposób powiązania każdej wartości wyliczenia z liczbą całkowitą, tak aby można było konwertować w obie strony (innymi słowy, potrzebuję „odwracalnego wyliczenia”).
Przejście od enum do int jest łatwe:
public enum BonusType {
public final int id;
BonusType(int id) {
this.id = id;
}
MONTHLY(1), YEARLY(2), ONE_OFF(3);
}
Wtedy mogę uzyskać dostęp do wartości int jako BonusType x = MONTHLY; int id = x.id;
.
Jednak nie widzę fajnego sposobu na odwrócenie, tj. Przejście z int do enum. Idealnie coś takiego
BonusType bt = BonusType.getById(2);
Jedyne rozwiązania, jakie mogłem wymyślić, to:
- Umieść metodę wyszukiwania w wyliczeniu, która
BonusType.values()
wypełnia mapę „int -> enum”, a następnie buforuje ją i używa do wyszukiwania. Zadziałałoby, ale musiałbym skopiować tę metodę identycznie do każdego wyliczenia, którego używam :-(. - Umieść metodę wyszukiwania w statycznej klasie narzędziowej. Wtedy potrzebowałbym tylko jednej metody „wyszukiwania”, ale musiałbym majstrować przy odbiciu, aby działał dla dowolnego wyliczenia.
Obie metody wydają się strasznie niewygodne w przypadku tak prostego (?) Problemu.
Jakieś inne pomysły / spostrzeżenia?
ordinal()
.ordinal()
), czy też są one ustalane przez siły zewnętrzne?