以下使用==
比较两个枚举值:
MyEnum enum1 = blah(); // could return null
MyEnum enum2 = blahblah() // could return null
if (enum1 == enum2) {
// ...
}
但PMD在第3行发出CompareObjectsWithEquals警告:
使用equals()比较对象引用
我不确定我是否理解source code for this check,但认为使用==
比较两个枚举是可以的,所以我想知道我的代码是否可以改进或检查是否错误。
答案 0 :(得分:18)
这确实被接受为错误:
然而,抓住所有可能的案例似乎很棘手(引自较新的bug):
那个有点棘手,为了确定一个类型是什么 一个枚举,我们需要类型解析。
我能够调整规则来检查,是否类型 变量是一个枚举。这只适用于Enum类型 pmd的“auxclasspath”,以便类型解析可以找到它。
你的孤立的例子仍会触发这种误报,如 PMD不知道ProcessingStatus是什么。我验证了它 java.math.RoundingMode,它始终位于类路径中并且将是 解决。
(“您的示例”是指票证作者,而不是堆栈溢出中的OP)
您的案例可能与PMD 5一起使用,您链接的来源属于PMD 4。
更新:current source包含额外的枚举检查:
// skip, if it is an enum
if (type0.getType() != null && type0.getType().equals(type1.getType()) && type0.getType().isEnum()) {
return data;
}
答案 1 :(得分:4)
可以使用.equals()
,因为under the hoods,会发生的情况是将实例与==
进行比较。
public final boolean equals(Object other) {
return this==other;
}
请注意,此.equals()
的实现是final
,这意味着您无法在枚举中覆盖它。