枚举与类加载器

时间:2010-11-26 17:26:05

标签: java enums

有时你可能甚至不知道你插入代码的环境有多个类加载器。在这种情况下,我仍然可以期望“==”操作对枚举值起作用吗?

3 个答案:

答案 0 :(得分:12)

多个类加载器可能不是问题,只要枚举只能通过其中一个获得。如果情况并非如此,则会失去枚举的所有好处。

顺便说一句,使用equals()也无济于事。这是Java 1.6中Enum.equals(Object)的实现:

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

答案 1 :(得分:9)

如果您的枚举类仅在加载后才会生效。

  • 您的枚举仅在已加载的插件中使用
  • 枚举已由各个插件类加载器的父类加载器加载

如果您的枚举类由不同的类加载器加载,则无效

  • 您在不同插件之间传递枚举值,但应用程序类加载器尚未加载枚举。 (如果枚举值永远不会在插件之间交叉,它仍然可以工作)

之所以如此

Java使用对象实例来表示不同的枚举值,这些实例中的每一个都存储为枚举类中的静态字段。如果枚举被加载两次,则每个枚举值由两个不同的对象实例表示。 == operator仅比较引用并且不知道表示枚举值的多个实例,因此它将无法匹配由不同类加载器加载的值。

答案 2 :(得分:-5)

"=="无法使用,但您仍想使用.equals()

您可能对apache commons lang class感兴趣:link text