Mam typ wyliczania, ReportTypeEnum
który jest przekazywany między metodami we wszystkich moich klasach, ale muszę przekazać to na adres URL, więc używam metody porządkowej, aby uzyskać wartość int. Po umieszczeniu go na innej stronie JSP muszę przekonwertować go z powrotem na wersję, ReportTypeEnum
aby móc kontynuować przekazywanie.
Jak przekonwertować numer porządkowy na ReportTypeEnum
?
Korzystanie z Java 6 SE.
Odpowiedzi:
Aby przekonwertować porządek porządkowy na jego enum represantację, możesz to zrobić:
Zwróć uwagę na granice tablicy.
Zauważ, że każde wywołanie
values()
zwraca nowo sklonowaną tablicę, co może mieć negatywny wpływ na wydajność. Możesz buforować tablicę, jeśli będzie często wywoływana.Przykład kodu, jak buforować
values()
.Ta odpowiedź została edytowana w celu uwzględnienia informacji zwrotnych podanych w komentarzach
źródło
To prawie na pewno zły pomysł . Oczywiście, jeśli porządek porządkowy jest de facto utrzymywany (np. Ponieważ ktoś dodał adres URL do zakładek) - oznacza to, że zawsze musisz zachować
enum
porządek w przyszłości, co może nie być oczywiste dla opiekunów kodu w dalszej kolejności.Dlaczego zamiast tego nie zakodować za
enum
pomocąmyEnumValue.name()
(i dekodować przezReportTypeEnum.valueOf(s)
)?źródło
value
albo na początku, albo we właściwej pozycji alfabetycznej / logicznej. (Przez logiczne rozumiem na przykładTimeUnit
, że wartości mają logiczną pozycję)Jeśli zamierzam
values()
dużo używać:Tymczasem wherever.java:
Uważaj na granice tablicy.
źródło
Suit.values[0] = Suit.Diamonds;
gdzieś w kodzie. Najlepiej, aby to nigdy się nie zdarzyło, ale nadal obowiązuje ogólna zasada nie ujawniania zmiennych pól . W przypadku tego podejścia rozważ użycieCollections.unmodifiableList
zamiast tego lub podobnego.Suit values[]
bezpośrednio lub pośrednio (jak wspomnianogetValues()
), pracuję z publiczną metodą, do którejordinal
należy wysłać wartość jako argument i zwrócićSuit
reprezentacjęSuit values[]
. Punktem tutaj (płytka pytania od samego początku) było stworzenie typu enum z enum ordinalZgadzam się z większością osób, że używanie porządkowej jest prawdopodobnie złym pomysłem. Zwykle rozwiązuję ten problem, dając enumowi prywatny konstruktor, który może na przykład wziąć wartość DB, a następnie utworzyć funkcję statyczną
fromDbValue
podobną do tej w odpowiedzi Jana.Teraz możesz zmienić kolejność bez zmiany wyszukiwania i odwrotnie.
źródło
Ty mógł używać statycznego tabeli odnośników:
źródło
0...(n-1)
, to tablica ma mniej kodu i jest bardziej czytelna; wzrost wydajności to tylko bonus.private static final Suit[] VALUES = values();
apublic Suit fromOrdinal(int ordinal) { return VALUES[ordinal]; }
. Dodatkowa zaleta: natychmiast zawiesza się przy nieprawidłowych porządkach, zamiast po cichu zwracać wartość null. (Nie zawsze jest to zaleta. Ale często.)Tego używam. Nie udaję, że jest on znacznie mniej „wydajny” niż prostsze rozwiązania powyżej. Zapewnia to znacznie wyraźniejszy komunikat wyjątku niż „ArrayIndexOutOfBounds”, gdy w powyższym rozwiązaniu użyto niepoprawnej wartości porządkowej.
Wykorzystuje fakt, że EnumSet javadoc określa, że iterator zwraca elementy w ich naturalnej kolejności. Jest twierdzenie, jeśli to nie jest poprawne.
Test JUnit4 pokazuje, jak jest używany.
źródło
Oto, co robię na Androidzie z Proguard:
jest krótki i nie muszę się martwić o wyjątek w Proguard
źródło
Możesz zdefiniować prostą metodę, taką jak:
I używaj go w następujący sposób:
źródło
klasa testowa
Doceniam to, że dzielisz się z nami, jeśli masz bardziej wydajny kod. Moje wyliczenie jest ogromne i ciągle wywoływane tysiące razy.
źródło
Tak więc jednym ze sposobów jest zrobienie tego,
ExampleEnum valueOfOrdinal = ExampleEnum.values()[ordinal];
co działa, a jego łatwe, jak wspomniano wcześniej,ExampleEnum.values()
zwraca nową sklonowaną tablicę dla każdego wywołania. To może być niepotrzebnie drogie. Możemy to rozwiązać, buforując tablicę w taki sposóbExampleEnum[] values = values()
. Jest również „niebezpieczne”, aby zezwolić na modyfikację naszej pamięci podręcznej. Ktoś mógłby napisać,ExampleEnum.values[0] = ExampleEnum.type2;
więc uczynię to prywatnym za pomocą metody akcesorium, która nie wykonuje dodatkowego kopiowania.Użyłbyś,
ExampleEnum.value(ordinal)
aby uzyskać wartość wyliczenia związaną zordinal
źródło
Każde wyliczenie ma nazwę (), która daje ciąg o nazwie członka wyliczenia.
Biorąc pod uwagę
enum Suit{Heart, Spade, Club, Diamond}
,Suit.Heart.name()
daHeart
.Każde wyliczenie ma
valueOf()
metodę, która wykonuje typ wyliczenia i ciąg znaków, aby wykonać operację odwrotną:Enum.valueOf(Suit.class, "Heart")
zwracaSuit.Heart
.Dlaczego ktokolwiek używałby porządków, jest poza mną. Może być szybszy o nanosekundy, ale zmiana enum nie jest bezpieczna, ponieważ inny programista może nie wiedzieć, że jakiś kod opiera się na wartościach porządkowych (zwłaszcza na stronie JSP cytowanej w pytaniu, narzut sieci i bazy danych całkowicie dominuje czas, bez używania liczby całkowitej w ciągu).
źródło