本文整理自實戰經驗,按重要性分級(Level 1 為最高),遵循可顯著提升效能、可讀性與維護性。
new String("literal") 建立字串物件// ❌ 浪費:每次執行都在堆上建立新物件
private String str = new String("1");
// ✅ 正確:直接使用字串常量(常量池複用)
private String str = "1";
String 為不可變類,字面值自動進入常量池,new 強制在堆上分配,零收益。
// ❌ 過度巢狀、難閱讀
int c = (a = a + b) + b;
// ✅ 拆分步驟,語意清晰
a = a + b;
int c = a + b;
// ❌ 易混淆
private int index, index1[];
// ✅ 分行、分類型
private int index;
private int[] index1;
// ❌ 壓行
int i = a + b; return i;
// ✅ 換行
int i = a + b;
return i;
finalize() 中務必調用 super.finalize()@Override
protected void finalize() throws Throwable {
try {
// 釋放自身資源
} finally {
super.finalize(); // 保證父類清理邏輯執行
}
}
即使父類未覆寫,也應養成習慣,防止未來父類新增清理邏輯被遺漏。
finalize() 移除 Listenerfinalize() 僅在物件不可達時由 GC 執行,若在其中移除 Listener,物件可能因 Listener 仍持有引用而無法被回收,造成記憶體洩漏。
finalize(),改用釋放方法// ❌ 錯誤:導致雙重 finalize、效能損耗
t7.finalize();
t7 = null;
// ✅ 正確:自定義 release(),冪等、可控
public class Resource {
private boolean released = false;
public synchronized void release() {
if (!released) {
closeResources();
released = true;
}
}
@Override
protected void finalize() throws Throwable {
release(); // 兜底
super.finalize();
}
}
定期檢視編譯警告,替換為推薦替代方案(如 List.addItem() → add())。
serialVersionUIDpublic class MyClass implements Serializable {
private static final long serialVersionUID = 1L; // 版本鎖定
// ...
}
否則 JVM 依類結構自動生成,類結構微調即導致反序列化失效(InvalidClassException)。
final// ❌ 可被意外修改
private int SIZE = 5;
// ✅ 編譯期常量,不可變
private static final int SIZE = 5;
// ❌ 遮蔽成員變數 j,易誤讀
public void method(int j) { ... }
private int j = 2;
// ✅ 參數改名,語意區分
public void method(int paramJ) { ... }
private int fieldJ = 2;
消除「遮蔽」帶來的認知負擔,SCJP 考試陷阱在實務中即為反面教材。
十一條規則涵蓋字串處理、控制流、宣告風格、資源釋放、API 選擇、序列化、常量定義、命名規範。建議納入團隊 Code Review 清單,配合 Checkstyle/SpotBugs 自動化檢查,將規範落地為日常習慣。