枚举与类加载器

Dim*_*ima 7 java enums

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

Sea*_*oyd 13

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

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

public final boolean equals(Object other) { 
    return this==other;
}
Run Code Online (Sandbox Code Playgroud)

  • 类加载器会破坏所有单例模式. (6认同)

jos*_*efx 9

如果你的枚举类只加载一次它仍然可以工作.

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

如果您的枚举类由不同的类加载器加载,它将无法工作

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

之所以这样

Java使用对象实例来表示不同的枚举值,这些实例中的每一个都存储为枚举类中的静态字段.如果枚举被加载两次,则每个枚举值由两个不同的对象实例表示.在== operator仅比较了引用,并不知道有表示枚举值的多个实例的,所以它会不匹配由不同类加载器加载的值.


b_e*_*erb -5

"=="不会起作用,但你.equals()还是想用。

您可能对 apache commons lang 类感兴趣:链接文本