我知道Java枚举是用私有构造函数和一堆公共静态成员编译成类的。当比较给定枚举的两个成员时,我总是使用.equals(),例如。
public useEnums(SomeEnum a)
{
if(a.equals(SomeEnum.SOME_ENUM_VALUE))
{
...
}
...
}
然而,我刚刚遇到一些使用equals运算符==而不是.equals()的代码:
public useEnums2(SomeEnum a)
{
if(a == SomeEnum.SOME_ENUM_VALUE)
{
...
}
...
}
我应该使用哪个操作员?
我想补充多基因润滑剂的答案:
我个人更喜欢equals()。但它缺少类型兼容性检查。我认为这是一个重要的限制。
要在编译时进行类型兼容性检查,请在枚举中声明并使用自定义函数。
public boolean isEquals(enumVariable) // compare constant from left
public static boolean areEqual(enumVariable, enumVariable2) // compare two variable
这样,您就获得了这两种解决方案的所有优点:NPE保护、易于阅读的代码和编译时的类型兼容性检查。
我还建议为enum添加一个未定义的值。
我更喜欢使用==而不是equals:
除了这里已经讨论过的其他原因之外,还有一个原因,那就是你可能会在没有意识到的情况下引入一个bug。假设你有一个完全相同的enums,但在不同的包中(这并不常见,但可能会发生):
第一个枚举:
package first.pckg
public enum Category {
JAZZ,
ROCK,
POP,
POP_ROCK
}
第二个枚举:
package second.pckg
public enum Category {
JAZZ,
ROCK,
POP,
POP_ROCK
}
然后假设您在item.category中使用了类似next的equals,即first.pckg.category,但您导入了第二个enum(second.pckkg.category),而不是第一个enum,而没有意识到它:
import second.pckg.Category;
...
Category.JAZZ.equals(item.getCategory())
因此,尽管item.getCategory()是JAZZ,但由于是一个不同的枚举,所以您将始终得到false。这可能有点难以理解。
因此,如果改用运算符==,将出现编译错误:
运算符==不能应用于“second.pkg.Category”、“first.pkg.Ccategory”
import second.pckg.Category;
...
Category.JAZZ == item.getCategory()