我知道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)
{
...
}
...
}
我应该使用哪个操作员?
tl;博士
另一个选项是Objects.equals实用程序方法。
Objects.equals( thisEnum , thatEnum )
Objects.equals表示空安全
equals运算符==而不是.equals()
我应该使用哪个操作员?
第三个选项是添加到Java7和更高版本的Objects实用程序类中的static equals方法。
实例
下面是使用Month枚举的示例。
boolean areEqual = Objects.equals( Month.FEBRUARY , Month.JUNE ) ; // Returns `false`.
福利
我发现这种方法有几个好处:
零安全性两者均为空➙ 真的要么为空➙ 假的没有引发NullPointerException的风险紧凑、可读
它的工作原理
Objects.equals使用的逻辑是什么?
请自行查看OpenJDK的Java 10源代码:
return
( a == b )
||
(
a != null
&&
a.equals( b )
)
;
只有一件事可以补充所有其他优秀的答案。当您使用简单的lambda时,我更喜欢等于而不是==,因为您可以使用方法引用。
考虑以下lambdas:
Stream.of(SomeEnum.A, SomeEnum.B).anyMatch(e -> e == SomeEnum.B);
Stream.of(SomeEnum.A, SomeEnum.B).anyMatch(e -> e.equals(SomeEnum.B));
后者可以转换为:
Stream.of(SomeEnum.A, SomeEnum.B).anyMatch(SomeEnum.B::equals));
我想补充多基因润滑剂的答案:
我个人更喜欢equals()。但它缺少类型兼容性检查。我认为这是一个重要的限制。
要在编译时进行类型兼容性检查,请在枚举中声明并使用自定义函数。
public boolean isEquals(enumVariable) // compare constant from left
public static boolean areEqual(enumVariable, enumVariable2) // compare two variable
这样,您就获得了这两种解决方案的所有优点:NPE保护、易于阅读的代码和编译时的类型兼容性检查。
我还建议为enum添加一个未定义的值。