PMD、Checkstyle、FindBugs 等靜態分析工具不僅能發現缺陷,其內建規則更是凝聚了社區的性能優化與代碼質量經驗。本文從 PMD 核心規則提煉 8 條高頻優化建議。
final int x = compute(); 編譯器將其視為常量傳播優化,減少運行時查找開銷。
// 差
\"Abc\".startsWith(\"A\");
// 優
\"Abc\".charAt(0) == 'A';
startsWith 內部有循環比較;charAt 直接數組索引,極快。
直接 + 拼接每次產生新 String 對象;StringBuilder 內部擴容字符數組,追加操作均攤 O(1)。建議預估長度指定初始容量(默認僅 16 字符)。
// 差
\"Abc\".indexOf(\"A\");
// 優
\"Abc\".indexOf('A');
底層實現分離:查找 char 走簡化循環,查找 String 需 KMP 等複雜算法。
默認容量 16,擴容涉及數組複製。預估大致長度用 new StringBuilder(estimatedSize)。
// 有風險
public static Foo getInstance() {
if (instance == null) instance = new Foo();
return instance;
}
// 修正
public static synchronized Foo getInstance() { ... }
// 或 DCL (volatile + 同步塊)
HashMap 判斷鍵相等邏輯:hashCode 相等 && equals 返回 true。若只改 equals,相等對象可能落入不同桶,導致 HashSet 存入重複元素。
// 危險:二進制浮點誤差帶入
new BigDecimal(0.1); // 實際值 0.10000000000000000555...
// 正確:精確表示
new BigDecimal(\"0.1\");
靜態分析規則是「可執行的最佳實踐文檔」,善用之,代碼質量與性能雙提升。