PMD程式碼檢查工具
ts/unusedcode.xml,rulesets/basic.xml
PMD 包含 16 個規則集,涵蓋了 Java 的各種常見問題,其中一些規則要比其他規則更有爭議:
基本(rulesets/basic.xml)—— 規則的一個基本合集,可能大多數開發人員都不認同它: catch 塊不該為空,無論何時重寫 equals(),都要重寫 hashCode(),等等。
命名(rulesets/naming.xml)—— 對標準 Java 命令規範的測試:變數名稱不應太短;方法名稱不應過長;類名稱應當以小寫字母開頭;方法和欄位名應當以小寫字母開頭,等等。
未使用的程式碼(rulesets/unusedcode.xml)—— 查詢從未使用的私有欄位和本地變數、執行不到的語句、從未呼叫的私有方法,等等。
設計(rulesets/design.xml)—— 檢查各種設計良好的原則,例如: switch 語句應當有 default 塊,應當避免深度巢狀的 if 塊,不應當給引數重新賦值,不應該對 double 值進行相等比較。
匯入語句(rulesets/imports.xml)—— 檢查 import 語句的問題,比如同一個類被匯入兩次或者被匯入 java.lang 的類中。
JUnit 測試(rulesets/junit.xml)—— 查詢測試用例和測試方法的特定問題,例如方法名稱的正確拼寫,以及 suite() 方法是不是 static 和 public。
字串(rulesets/string.xml)—— 找出處理字串時遇到的常見問題,例如重複的字串標量,呼叫 String 建構函式,對 String 變數呼叫 toString() 方法。
括號(rulesets/braces.xml)—— 檢查 for、 if、 while 和 else 語句是否使用了括號。
程式碼尺寸(rulesets/codesize.xml)—— 測試過長的方法、有太多方法的類以及重構方面的類似問題。
Javabean(rulesets/javabeans.xml)—— 檢視 JavaBean 元件是否違反 JavaBean 編碼規範,比如沒有序列化的 bean 類。
終結函式(finalizer)—— 因為在 Java 語言中, finalize() 方法不是那麼普遍(我上次編寫這個程式碼也經是好多年前的事了),所以它們的使用規則雖然很詳細,但是人們對它們相對不是很熟悉。這類檢查查詢 finalize() 方法的各種問題,例如空的終結函式,呼叫其他方法的 finalize() 方法,對 finalize() 的顯式呼叫,等等。
克隆(rulesets/clone.xml)—— 用於 clone() 方法的新規則。凡是重寫 clone() 方法的類都必須實現 Cloneable, clone() 方法應該呼叫 super.clone(),而 clone() 方法應該宣告丟擲 CloneNotSupportedException 異常,即使實際上沒有丟擲異常,也要如此。
耦合(rulesets/coupling.xml)—— 查詢類之間過度耦合的跡象,比如匯入內容太多;在超型別或介面就已經夠用的時候使用子類的型別;類中的欄位、變數和返回型別過多等。
嚴格的異常(rulesets/strictexception.xml)—— 針對異常的測試:不應該宣告該方法而丟擲 java.lang.Exception 異常,不應當將異常用於流控制,不應該捕獲 Throwable,等等。
有爭議的(rulesets/controversial.xml)—— PMD 的有些規則是有能力的 Java 程式設計師可以接受的。但還是有一些爭議。這個規則集包含一些更有問題的檢驗,其中包括把 null 賦值給變數、方法中有多個返回點,以及從 sun 包匯入等。
日誌(rulesets/logging-java.xml)—— 查詢 java.util.logging.Logger 的不當使用,包括非終狀態(nonfinal)、非靜態的記錄器,以及在一個類中有多個記錄器。