Enums haben definitiv Grenzen, mit der primären (harten) Grenze um 32K Werte. Sie unterliegen Java-Klassen-Maxima, sowohl dem 'Konstanten-Pool' (64K Einträge) als auch - in einigen Compiler-Versionen - einem Methoden-Größenlimit (64K Bytecode) auf dem statischen Initialisierer.
'Enum' Initialisierung intern verwendet zwei Konstanten pro Wert - eine FieldRef und eine Utf8-Zeichenfolge. Dies ergibt die "harte Grenze" bei ~ 32K Werten.
Ältere Compiler (zumindest Eclipse Indigo) haben ebenfalls ein Problem hinsichtlich der Größe der statischen Initialisierungsmethode. Mit 24 Byte Bytecode, die erforderlich sind, um jeden Wert zu initialisieren, fügen Sie & dem Array Werte hinzu. eine Grenze um 2730 Werte kann auftreten.
Neuere Compiler (mindestens JDK 7) teilen große statische Initialisierer automatisch in die Methoden " enum constant initialization$2"
, " enum constant initialization$3"
usw. auf, so dass sie nicht der zweiten Grenze unterliegen.
Sie können Bytecode über javap -v -c YourEnum.class
demontieren, um zu sehen, wie dies funktioniert.
[Es könnte theoretisch möglich sein, eine "alte" Enum-Klasse als handcodiertes Java zu schreiben, um die Grenze von 32 K zu überschreiten und nahe 64K-Werten zu erreichen. Der Ansatz wäre, die Enum-Werte durch Reflektion zu initialisieren, um die Verwendung von String-Konstanten im Pool zu vermeiden. Ich testete diesen Ansatz und es funktioniert in Java 7, aber die Erwünschtheit eines solchen Ansatzes (Sicherheitsprobleme) ist fraglich.]
Wahrscheinlich weniger als 4 Milliarden. – Robert
Ich habe keine Ahnung, aber würde gerne wissen, welche Art von Code denken Sie an, dass würde die maximale Größe eines Enum lol benötigen –
Wenn ein s mit 2 Milliarden Fällen wechseln, werde ich wahrscheinlich jemanden töten, der hat habe diesen Code berührt. – Bozho