Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么使用==比较枚举会导致PMD警告?_Java_Enums_Comparison_Pmd - Fatal编程技术网

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

Java 为什么使用==比较枚举会导致PMD警告?,java,enums,comparison,pmd,Java,Enums,Comparison,Pmd,下面使用==比较两个枚举值: MyEnum enum1 = blah(); // could return null MyEnum enum2 = blahblah() // could return null if (enum1 == enum2) { // ... } 但PMD在第3行给出警告: 使用equals()比较对象引用 我不确定是否理解,但认为使用==比较两个枚举是可以的,因此我想知道我的代码是否可以改进或者检查是否不正确。使用.equals()是可以的,因为所

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

MyEnum enum1 = blah();     // could return null
MyEnum enum2 = blahblah()  // could return null
if (enum1 == enum2) {
    // ...
}
但PMD在第3行给出警告:

使用equals()比较对象引用


我不确定是否理解,但认为使用
==
比较两个枚举是可以的,因此我想知道我的代码是否可以改进或者检查是否不正确。

使用
.equals()
是可以的,因为所发生的事情是将实例与
=
进行比较

public final boolean equals(Object other) {
    return this==other;
}

请注意,
.equals()
的这个实现是
最终的
,这意味着您不能在枚举中重写它。

这确实被认为是错误:

然而,捕捉所有可能的情况似乎很棘手(引用较新的bug):

这是一个有点棘手的问题,因为为了确定一个类型是否是 一个枚举,我们需要类型解析

我可以调整规则来检查 变量是一个枚举。仅当枚举类型位于 pmd的“auxclasspath”,以便类型解析可以找到它

你孤立的例子仍然会触发这个假阳性,就像 PMD不知道ProcessingStatus是什么。我跟你核实过了 java.math.RoundingMode,它始终位于类路径上,并将 决心

(“您的示例”指的是票证作者,而不是堆栈溢出上的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;
 }

谢谢-但是任何一个枚举都可能为null,因此不想冒NullPointerException的风险。然后您必须添加一个检查。或者使用Java8的
可选
类型:或者坚持使用
enum1==enum2
忽略此PMD警告。这是正常的。可能相关:另请参见。