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

Ste*_*ers 6 java comparison enums pmd

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

MyEnum enum1 = blah();     // could return null
MyEnum enum2 = blahblah()  // could return null
if (enum1 == enum2) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

但是PMD 在第3行给出了CompareObjectsWithEquals警告:

使用equals()来比较对象引用

不确定我理解这个检查源代码,但认为比较两个枚举是可以的,==所以我想知道我的代码是否可以改进或检查是否错误.

Mar*_*vin 18

这确实被接受为bug:

但是,捕获所有可能的情况似乎很棘手(引自较新的bug):

那个有点棘手,为了确定一个类型是否是Enum,我们需要类型解析.

我能够调整规则来检查变量的类型是否为Enum.这仅适用于枚举类型位于pmd的"auxclasspath",以便类型解析可以找到它.

您的隔离示例仍会触发此误报,因为PMD不知道ProcessingStatus是什么.我用java.math.RoundingMode验证了它,它始终在类路径上并将被解析.

("您的示例"是指票证作者,而不是Stack Overflow上的OP)

您的案例可能适用于PMD 5,您链接的来源属于PMD 4.

更新:当前源包含额外的枚举检查:

 // skip, if it is an enum
 if (type0.getType() != null && type0.getType().equals(type1.getType()) && type0.getType().isEnum()) {
      return data;
 }
Run Code Online (Sandbox Code Playgroud)