Wenn ich ein enum-Objekt habe, wird es als primitiv oder als Referenz betrachtet?Werden Java-Enums als primitive oder Referenztypen betrachtet?
Antwort
Es ist ein Referenztyp.
Im Gegensatz zu vielen Sprachen, in denen enum
eine Reihe von Integralkonstanten ist, sind Java-Enums unveränderliche Objektinstanzen. Sie können den numerischen Wert einer enum-Instanz abrufen, indem Sie ordinal()
aufrufen.
Sie können sogar Ihre eigenen Mitglieder in die Enum-Klasse, wie folgt hinzufügen:
public enum Operation {
PLUS { double eval(double x, double y) { return x + y; } },
MINUS { double eval(double x, double y) { return x - y; } },
TIMES { double eval(double x, double y) { return x * y; } },
DIVIDE { double eval(double x, double y) { return x/y; } };
// Do arithmetic op represented by this constant
abstract double eval(double x, double y);
}
//Elsewhere:
Operation op = Operation.PLUS;
double two = op.eval(1, 1);
+1 Ich war mir dieser Funktionalität nicht bewusst. Können Sie ein Beispiel für die Verwendung dieser Operation in Aktion geben? – corsiKa
'Enum'-Instanzen müssen eigentlich nicht unveränderlich sein. Ein Enum kann veränderbare Variablen haben. – sepp2k
@glowcoder: 'Operation.PLUS.eval (1, 1)' – SLaks
This article im Wesentlichen zeigt Ihnen, wie Aufzählungen umgesetzt werden, und wie SLaks sagt, sie sind Referenzen.
Die Art und Weise Aufzählungen Arbeit ist eigentlich nicht viel anders aus, wie sie vor ihrer Einführung wurden verwendet, um mit Java 5:
public final class Suit {
public static final Suit CLUBS = new Suit();
public static final Suit DIAMONDS = new Suit();
public static final Suit HEARTS = new Suit();
public static final Suit SPADES = new Suit();
/**
* Prevent external instantiation.
*/
private Suit() {
// No implementation
}}
Durch die unterschiedlichen Farben auf das Laden von Klassen instanziieren sichergestellt ist, dass diese sich gegenseitig ausschließen wird und Der private Konstruktor stellt sicher, dass keine weiteren Instanzen erstellt werden.
Diese wären entweder durch == oder gleichwertig vergleichbar.
ENUM Java 5 funktioniert so ziemlich die gleiche Art und Weise, aber mit einigen notwendigen Funktionen Serialisierung usw.
Ich hoffe, dieser Hintergrund wirft ein weiteres Licht zu unterstützen.
Enums sind Referenztypen, da sie Methoden haben können und auch von der Kommandozeile ausgeführt werden können, wenn sie die Hauptmethode haben.
Siehe folgende "Planet" Beispiel von Sun/Oracle
http://download.oracle.com/javase/tutorial/java/javaOO/enum.html
- 1. Warum werden Klassen als Referenztypen betrachtet?
- 2. Werden Foren als Tabellendaten betrachtet?
- 3. Kann eine Variable wie 'int' als primitive/fundamentale Datenstruktur betrachtet werden?
- 4. Werden diese als Javascript-Verschlüsse betrachtet?
- 5. Ist es besser, Referenztypen oder primitive Typen in Java zu verwenden?
- 6. Wird Mixin als Designmuster betrachtet?
- 7. Wird SID als empfindlich betrachtet?
- 8. Werden Entscheidungsbäume (z. B. C4.5) als nichtparametrisches Lernen betrachtet?
- 9. Werden dynamische COM-Objekte als verwaltete Ressourcen betrachtet?
- 10. Warum werden Arrays nicht als Subtyp von Collection betrachtet?
- 11. C++ 11 Können nur primitive Datentypen als atomar deklariert werden?
- 12. Sollte SQL-Ranking-Funktionalität als "Verwendung mit Vorsicht" betrachtet werden
- 13. Sollten .NET-Strings wirklich als unveränderlich betrachtet werden?
- 14. Wird dies als SFINAE betrachtet?
- 15. Warum werden All-Caps konstant als schlechter Codierungsstil betrachtet?
- 16. kann dieses Beispiel als Mehrfachvererbung in Javascript betrachtet werden?
- 17. Sollten die Postfix-Operatoren nicht als binäre Operatoren betrachtet werden
- 18. Wie viele Klassen würden als "schlechte Praxis" betrachtet werden
- 19. HornetQ: Welche Versionen können als stabil betrachtet werden?
- 20. Sollen IP-Adressen und Ports als vertraulich betrachtet werden?
- 21. Kann asmx als Alternative zu XML betrachtet werden?
- 22. Primitive Synchronisation Primitive - sicher?
- 23. Warum wird HTTP/SOAP als "dick" betrachtet?
- 24. Würde diese JS-Funktion als rekursiv betrachtet?
- 25. nur primitive Typen oder Aufzählungstypen werden in diesem Zusammenhang unterstützt
- 26. Sollten WCF DataContracts Wert- oder Referenztypen sein?
- 27. 3rd Party Jars bei WEB-INF/lib werden als statisch oder dynamisch betrachtet. Lib
- 28. Java Warum wird eine Long (64) in Float (32) als Erweiterung betrachtet?
- 29. Wird EJB 2 als veraltet betrachtet?
- 30. Was wird in Angular als Beobachter betrachtet?
Aufzählungen sind absolut normal Klassen w/einige Optimierungen (für die Serialisierung) + c-tor-Check für Vererbungsstufe + extra gemeinsamen Array (nicht geklonte()) der deklarierten enums. Die public method values () gibt immer eine neue Kopie zurück. Sie können Schnittstellen implementieren und was nicht :) – bestsss