Worauf baut Java eine Enumeration auf?

8

Ein Kollege und ich hatten eine Diskussion darüber, wie Java Aufzählungen darstellt. Ich hatte den Eindruck, dass sie streng wie C / C ++ waren. Oder, wenn Sie Verhalten hinzufügen (Type-Safe enum), wird es in eine Klasse eingeschlossen. Er glaubte, dass, wenn es klein genug ist, Java es zu einem Byte komprimieren würde.

Allerdings habe ich das auf der Oracle-Site gefunden:

Java-Programmiersprachen enums sind viel mächtiger als ihre Gegenstücke in anderen Sprachen, die wenig mehr als glorifizierte Integer sind. Die neue Enum-Deklaration definiert eine vollwertige Klasse (genannt ein Enum-Typ).

Ich nehme an, sie sind dann tatsächliche Objekte. Wenn ja, gibt es eine Möglichkeit, sie zu optimieren, um Platz zu sparen?

Danke

Bearbeiten: Wie in einem Kommentar zu Jons Antwort erwähnt, bin ich hinter der Serialisierungsgröße einer Enum.

    
Tony 01.09.2011, 21:29
quelle

1 Antwort

18

Nein, Java-Enum-Werte sind wirklich Objekte. Sie können Felder, Methoden usw. haben - und verschiedene Implementierungen von Methoden pro Wert. Es gibt jedoch nur einen festen Satz von ihnen - es ist nicht so, dass Sie Instanzen des Enum-Typs selbst erstellen; Die Menge der gültigen Werte wird zur Zeit der Typinitialisierung erstellt. Es sei denn, Sie haben eine riesige Anzahl von Enum-Werten, es ist sehr unwahrscheinlich, dass Sie sogar über Optimierung nachdenken müssen.

Beachten Sie, dass ein Optimierungspotential, das ist, leicht zu erreichen ist mit EnumSet , wenn Sie eine Reihe von Enum-Werten logisch betrachten. Dies verwendet ein Bitmuster, um das Set im Grunde effizient darzustellen.

(Beachten Sie, dass C # hier näher an C ++ als Java ist - die C # -Enumer sind leider nicht objektorientiert. Seufz.)

EDIT: Enum-Werte werden durch name nach die Dokumentation :

  

Der Serialisierung wurde Unterstützung hinzugefügt, um Aufzählungstypen zu behandeln, die in Version 5.0 neu sind. Die Regeln zum Serialisieren einer Enum-Instanz unterscheiden sich von denen zum Serialisieren eines "gewöhnlichen" serialisierbaren Objekts: Die serialisierte Form einer Enum-Instanz besteht nur aus ihrem Enum-Konstantennamen zusammen mit Informationen, die ihren Basis-Enum-Typ identifizieren. Das Deserialisierungsverhalten ist ebenfalls unterschiedlich - die Klasseninformationen werden verwendet, um die geeignete Enum-Klasse zu finden, und die Methode Enum.valueOf wird mit dieser Klasse und dem Namen der empfangenen Konstante aufgerufen, um die Enum-Konstante zu erhalten.

Wenn Sie wirklich nach einer kleinen serialisierten Form suchen, sollten Sie wahrscheinlich trotzdem die Java-eingebaute Serialisierung vermeiden, die relativ ausführlich ist (und außerdem äußerst empfindlich auf Versionierungsprobleme reagiert). Es gibt alle Arten von Alternativen - die eine, die ich am besten kenne, ist Protokollpuffer , die Enumerationswerte serialisiert, als nur Ganzzahlen.

    
Jon Skeet 01.09.2011, 21:32
quelle