为什么使用==比较枚举导致PMD警告?

时间:2015-06-18 13:03:05

标签: java enums comparison pmd

以下使用==比较两个枚举值:

MyEnum enum1 = blah();     // could return null
MyEnum enum2 = blahblah()  // could return null
if (enum1 == enum2) {
    // ...
}

但PMD在第3行发出CompareObjectsWithEquals警告:

  

使用equals()比较对象引用

我不确定我是否理解source code for this check,但认为使用==比较两个枚举是可以的,所以我想知道我的代码是否可以改进或检查是否错误。

2 个答案:

答案 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,这意味着您无法在枚举中覆盖它。