Manchmal können Sie auch nicht wissen, dass die Umgebung, die Sie Sie Code Plug in mehr als einem Class-Loader hat. Darf ich noch erwarten, dass die Operation "==" in diesem Fall mit Enumerationswerten arbeitet?Enum gegen Klassenlader
Antwort
"=="
wird nicht funktionieren, aber Sie wollen .equals()
trotzdem verwenden.
Sie könnten in der Apache commons lang Klasse interessieren: link text
Multiple Classloader nicht das Problem sein kann, solange die ENUM durch eine von ihnen nur zur Verfügung steht. Wenn das nicht der Fall ist, verlieren Sie alle Vorteile eines Enums.
Und übrigens, equals()
Verwendung auch nicht hilft. Hier ist die Implementierung von Enum.equals(Object)
in Java 1.6:
public final boolean equals(Object other) {
return this==other;
}
Das gleiche hier wie auf josefx's post; Es kann immer noch funktionieren, wenn ein Enum von mehreren Klassenladern geladen wird, man muss nur darauf achten, dass sie voneinander isoliert sind. –
Sicher, aber es ist ein Schmerz. Es bricht jede Annahme, die man über Enums macht. Und es bricht das Enum-Singleton-Muster. –
Klassenlader brechen alle Singleton-Muster. – josefx
Wenn Ihre Enum-Klasse nur einmal geladen wird, wird es immer noch funktionieren.
- Ihre Enum werden von verschiedenen Classloader es geladen innerhalb des geladenen Plugins
- die Enum geladen wurden von einem Elternteil Classloader des einzelnen Plug-Classloader
Wenn Ihre Enum-Klasse wird nur verwendet, wird nicht funktionieren
- übergeben Sie die Enum-Werte zwischen verschiedenen Plugins, sondern die Anwendung cla Der ssloader hat die enum nicht geladen. (Es kann immer noch funktionieren, wenn die ENUM-Werte nie zwischen Plugins kreuzen)
Der Grund, warum es so ist
Java verwendet Objektinstanzen, die verschiedenen ENUM-Werte zu repräsentieren, wobei jede dieser Instanzen gespeichert als ein statisches Feld innerhalb der enum-Klasse. Wenn die Enumeration zweimal geladen wird, wird jeder Enumerationswert durch zwei verschiedene Objektinstanzen repräsentiert. Die == operator
vergleicht nur die Verweise und weiß nicht, dass mehrere Instanzen einen Aufzählungswert darstellen, sodass die von verschiedenen Klassenladeprogrammen geladenen Werte nicht übereinstimmen.
"Der Operator == vergleicht nur die Referenzen" klingt ein bisschen wie ein Dogma. Enum ist schon eine ganz besondere Sache. Eine weitere Besonderheit könnte darin bestehen, "==" als "this.ordinal() == that.ordinal()" zu definieren. Könnte das das Problem lösen? – Dima
@Dima solange beide geladenen Definitionen der Enum identisch sind, wird es funktionieren. Der Ordinalwert enthält nur den Index (Position) der Enum-Konstante im Quellcode, wenn der Code sich ändert (neue Werte, andere Reihenfolge), würde er immer noch brechen. Wenn Geschwindigkeit kein Problem ist, können Sie ihre Namen vergleichen. – josefx
- 1. Enum-Getter gegen Getter für jeden Status
- 2. Ein Mustervergleich gegen einen Konstruktor einer Enum
- 3. javax.xml.bind.DatatypeConverter undichte Klassenlader?
- 4. Welcher Klassenlader wird verwendet?
- 5. Welcher Klassenlader für Parcel.readHashMap?
- 6. Warum werden mehr Klassenlader benötigt?
- 7. Java-Objekt/Klasse von einem Klassenlader in einen anderen Klassenlader kopieren
- 8. Kristallraum gegen Irrlicht gegen .....?
- 9. Warum brauchen wir benutzerdefinierte Klassenlader in Java
- 10. Verschiedene Klassenlader für verschiedene JUnit-Tests verwenden?
- 11. Javascript Enum innerhalb einer Enum
- 12. Get Enum von ENUM Attribut
- 13. Enum von Enum ist NULL
- 14. Java benutzerdefinierte Enum-Wert ENUM
- 15. Akka Kill gegen Stop gegen Giftpille?
- 16. @synchronized gegen NSLock Instanz gegen pthread_mutex_t
- 17. Warum ist "enum of enum of enum.." erlaubt?
- 18. Django Model - Auswahl gegen Fremdschlüssel?
- 19. GC.KeepAlive gegen
- 20. Native Bibliothek sqljdbc_auth.dll bereits in einem anderen Klassenlader geladen
- 21. Eine Liste aller Klassenlader in einer JVM erhalten
- 22. Wie lädt ein Klassenlader Klassenreferenz im Manifest-Klassenpfad?
- 23. Mit einem benutzerdefinierten Klassenlader für eine Modulabhängigkeit in SBT
- 24. Warum kann der Java-Klassenlader meine Schnittstelle nicht finden?
- 25. Sind Instanzen der Klassenklasse garantiert Einzelklassen pro Klassenlader?
- 26. Verwenden von Java-Klassenlader, um Stack-Trace zu bekommen
- 27. Benötigen Sie einen Java-Klassenlader nur für System
- 28. Enum in Hibernate, persistierende als Enum
- 29. wie C++ enum in Objective C Enum
- 30. Bedingter Enum-Schalter mit gespeicherter Enum
Die Frage ist - würde 'equals()' arbeiten? –
BTW, Implementierung von Enum 'equals()' ruft nur 'this == other' (Sun/Oracle JDK 6) auf. –
yup, wie ich gerade in meiner eigenen Antwort schrieb –