有时候您可能并不知道您的代码所在的环境中有多个类加载器。即使在这种情况下,我还能期望"=="操作符可以用于枚举值吗?
只要枚举类型只通过一个类加载器可用,多个类加载器可能不是问题。如果不是这种情况,您将失去枚举类型的所有好处。
另外,使用equals()
也无法解决问题。以下是Java 1.6中Enum.equals(Object)
的实现:
public final boolean equals(Object other) {
return this==other;
}
如果你的枚举类只被加载一次,它仍然可以工作。
如果你的枚举类被不同的类加载器加载,它将无法工作
为什么会出现这种情况
Java使用对象实例来表示不同的枚举值,每个实例都存储在枚举类中的静态字段中。如果枚举被加载两次,每个枚举值由两个不同的对象实例表示。 ==操作符
只比较引用,并不知道代表枚举值的多个实例,因此无法匹配由不同类加载器加载的值。
"=="
不会起作用,但你仍然想使用 .equals()
。
你可能会对 Apache Commons Lang 类感兴趣:链接文本
equals()
实现只是调用了 this==other
(Sun/Oracle JDK 6)。 - Grzegorz Oledzki==
永远不会有效,而 .equals()
可能(!)有效。请参见 apache-commons 枚举实现。 - b_erb