2015-06-18 97 views
6

下比較了使用==,兩個枚舉值:爲什麼使用==比較枚舉會導致PMD警告?

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

但PMD給出了一個CompareObjectsWithEquals警告第3行:

使用equals()方法來比較對象引用

不知道我瞭解source code for this check,但認爲可以比較兩個使用==的枚舉,所以我想知道我的代碼是否可以改進或者che ck不正確。

+2

這是可以的。可能是相關的:http://sourceforge.net/p/pmd/bugs/1028/ – MadConan

回答

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; 
} 
4

可以使用.equals(),因爲under the hoods會發生什麼情況是將實例與==進行比較。

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

注意,此實現的.equals()final,這意味着你不能在你的枚舉覆蓋它。

+0

謝謝 - 但任一個枚舉可以爲null,所以不想冒NullPointerException的風險。 –

+0

然後你必須添加一張支票。或者使用Java8的'Optional '類型。 :) –

+6

或者堅持'enum1 == enum2'並忽略此PMD警告。 – stuXnet