2010-11-26 93 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只比较引用并且不知道表示枚举值的多个实例,所以它将无法匹配不同类加载器加载的值。