命名與基本結構
- 命名慣例:類別 PascalCase、方法/欄位 camelCase、常數全大寫底線分隔、套件全小寫。
- 經典類別範本:實作
equals()、hashCode()、toString()、clone() (Cloneable)、Serializable。
- 內建測試:每個類別提供
main() 作為單元測試與使用範例,無需刪除即可發布。
方法與職責設計
- 單一職責:方法短小精悍,僅完成一件事;過長則拆分,促進重用。
- 雙重視角:站在呼叫端(API 直覺好用)與維護端(易擴充、易修改)雙重審視設計。
類別粒度與封裝
- 高內聚低耦合:複雜 switch → 多型;大量型別判斷 → 拆分類別;成員變數性質迥異 → 拆分類別。
- 極致私有化:預設
private,只暴露必要 public API。多執行緒下唯有 private 欄位受保護。
- 髒代碼隔離:不得已的妥協代碼封裝在類別內部,不外洩。
- 緊密關聯用內部類:兩類別高度耦合時,考慮內部類改善封裝與維護。
文檔與常數管理
- Javadoc 習慣:詳細註解並產出專業文檔。
- 拒絕魔術數字:以具語意的
static final 常數取代硬編碼數值。
建構子與異常處理
- 建構子失敗快速失敗:捕獲異常後重新拋出(包裝為 RuntimeException),避免呼叫端誤以為物件建立成功。
- 建構子內避免呼叫可覆寫方法:防止子類覆寫導致半初始化狀態下執行不可預期邏輯。
資源清理與 finalize
- 顯式清理方法:提供
cleanup(),配合 boolean cleaned 標記;finalize() 中檢查並拋出異常提醒程式錯誤(需啟用 System.runFinalizersOnExit(true))。
- try-finally 確保清理:建立物件後立即進入
try { ... } finally { cleanup() }。
- finalize 連鎖呼叫:覆寫時最後呼叫
super.finalize(),確保父類資源尚可用。
集合回傳與介面導向
- 固定大小集合回傳陣列:享受編譯期型別檢查,呼叫端免強制轉型。
- 優先介面、次抽象類別:介面描述「做什麼」,類別實作「怎麼做」;僅需方法定義/成員變數時才用 abstract class。
物件行為與封裝
- 建構子最小化:僅完成狀態初始化,避免呼叫其他方法。
- 物件具備行為:不只是資料容器,封裝業務邏輯與不變條件。
這 20 條法則涵蓋命名、結構、封裝、異常、資源、介面等全維度,內化為肌肉記憶,即能寫出專業級、可長期演進的 Java 類別。