2010-11-26 55 views
5

有時候你甚至可能不知道你插入代碼的環境有多個類加載器。在這種情況下,我是否仍然期望操作「==」對枚舉值有效?enum與類加載器

回答

-5

"=="將無法​​正常工作,但您仍然想要使用.equals()

你可能有興趣在Apache Commons Lang中類:link text

+1

問題是 - 'equals()`會起作用嗎? – 2010-11-26 17:30:28

+1

順便說一句,Enum`equals()`的實現只是調用`this == other`(Sun/Oracle JDK 6)。 – 2010-11-26 17:32:54

+0

是的,正如我剛剛在我自己的回答中所寫的那樣 – 2010-11-26 17:34:45

11

多個類加載器可能不是問題,只要枚舉只能通過其中的一個。如果情況並非如此,您將失去枚舉的所有好處。

順便說一下,使用equals()也沒有幫助。下面是Enum.equals(Object)在Java 1.6的實現:

public final boolean equals(Object other) { 
    return this==other; 
} 
8

如果枚舉類只加載一次它仍然可以工作。

  • 您的枚舉僅裝載的插件內使用
  • 枚舉已經由個別插件類加載器的父類加載器加載

如果枚舉類是由不同的類加載器加載它將不起作用

  • 你傳遞不同插件之間的枚舉值,但應用程序cla ssloader尚未加載枚舉。 (它仍然可以工作,如果枚舉值永遠不會插件之間的交叉)

它之所以是這樣

Java使用對象實例來表示不同的枚舉值,每個實例存儲作爲枚舉類中的靜態字段。如果枚舉被加載兩次,則每個枚舉值由兩個不同的對象實例表示。 == operator只比較引用並且不知道表示枚舉值的多個實例,所以它將無法匹配不同類加載器加載的值。