2010-11-26 3 views
5

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

-5

"==" wird nicht funktionieren, aber Sie wollen .equals() trotzdem verwenden.

Sie könnten in der Apache commons lang Klasse interessieren: link text

+1

Die Frage ist - würde 'equals()' arbeiten? –

+1

BTW, Implementierung von Enum 'equals()' ruft nur 'this == other' (Sun/Oracle JDK 6) auf. –

+0

yup, wie ich gerade in meiner eigenen Antwort schrieb –

11

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; 
} 
+0

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. –

+0

Sicher, aber es ist ein Schmerz. Es bricht jede Annahme, die man über Enums macht. Und es bricht das Enum-Singleton-Muster. –

+5

Klassenlader brechen alle Singleton-Muster. – josefx

8

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.

+0

"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

+0

@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

Verwandte Themen