Wyliczenia z pewnością mają ograniczenia, przy czym główny (twardy) limit wynosi około 32K wartości. Podlegają one maksymalnym klasom Java, zarówno "puli stałej" (wpisy 64K) oraz - w niektórych wersjach kompilatorów - do limitu rozmiaru metody (kod bajtowy 64K) na inicjalizatorze statycznym.
Inicjalizacja "Enum" wewnętrznie, wykorzystuje dwie stałe na wartość - łańcuch FieldRef i łańcuch Utf8. Daje to "twardy limit" przy wartościach ~ 32K.
Starsze kompilatory (przynajmniej Eclipse Indigo) również napotkały problem dotyczący statycznego rozmiaru inicjalizatora. Z 24 bajtami kodu bajtowego wymaganego do utworzenia instancji każdej wartości & dodaj ją do tablicy wartości. można napotkać limit około 2730 wartości.
Nowsze kompilatory (przynajmniej JDK 7) automatycznie dzielą duże inicjatory statyczne na metody o nazwach " enum constant initialization$2"
, " enum constant initialization$3"
itd., Więc nie podlegają drugiemu limitowi.
Można zdemontować kod bajtowy za pomocą javap -v -c YourEnum.class
, aby zobaczyć, jak to działa.
[Możliwe, że teoretycznie można napisać klasę Enum "starego stylu" jako handcoded Java, aby przełamać limit 32 KB i zbliżyć się do wartości 64K. Podejściem byłoby zainicjowanie wartości wyliczonych przez odbicie, aby uniknąć stałych ciągów w puli. Przetestowałem to podejście i działa ono w języku Java 7, ale celowość takiego podejścia (kwestie bezpieczeństwa) są wątpliwe.]
Prawdopodobnie mniej niż 4 miliardy. – Robert
Nie mam pojęcia, ale chciałbym wiedzieć, jaki typ kodu myślisz o tym, że musisz znać maksymalny rozmiar enum lol –
Jeśli widzę przełącznik z 2 miliardami przypadków, prawdopodobnie zabiję każdego, kto ma dotknął tego kodu. – Bozho