- 命名慣例:類名 PascalCase;方法、欄位、變數 camelCase;常數全大寫底線分隔 (如
MAX_COUNT)。
- 經典類別範本:覆寫
equals()、hashCode()、toString()、實作 Cloneable、Serializable。
- 每個類別內建
main() 測試:方便單元驗證、當作使用範例、重構後快速回歸。
- 方法短小單一:一個方法只做一件事;過長則拆分,促進重用與可讀性。
- 以使用者為中心設計 API:介面直觀、變更易管理、文件完善。
- 類別專一小巧:複雜 switch 改多型;操作差異大拆類別;欄位特徵迥異拆類別。
- 封裝:預設 private:只公開必要介面,保護不變條件、利於多執行緒安全、減少耦合。
- 避免「上帝物件」:別把流程式程式塞進一兩個巨大類別;物件表達領域概念,非應用程式本身。
- 醜陋代碼隔離:不得已的 hack 封裝在類別內部,勿外洩。
- 緊密耦合改用內部類別:提高封裝性、簡化存取外部類別私有成員。
- 詳盡註解 + Javadoc:生成專業 API 文件,利己利人。
- 拒絕魔術數字:用具名常數 (
static final int MAX_RETRY = 3;) 提升可讀與可維護性。
- 建構子異常處理:建構失敗時重拋異常,避免呼叫端誤以為物件建立成功。
- 明確清理介面:提供
cleanup()/close()、boolean released 標記、finalize() 防禦性檢查 (需啟用 System.runFinalizersOnExit(true))。
- 資源釋放用 try-finally:初始化成功後立即進
try { ... } finally { cleanup(); } 確保釋放。
- 覆寫
finalize() 呼叫 super.finalize():放在最後執行,確保父類資源尚可用。
- 固定大小集合回傳陣列:享受編譯期型別檢查,呼叫端免轉型。
- 優先介面而非抽象類別:介面定義契約,抽象類別僅在需共享實作/狀態時使用。
- 建構子避免呼叫可覆寫方法:防止子類覆寫導致未初始化狀態下執行邏輯。
- 物件應有行為:不只是資料容器,封裝業務操作。
- 組合優於繼承:需共用功能優先組合 (新建/委派);僅在真正 is-a 關係用繼承。
- 繼承表達行為差異,欄位表達狀態差異:別用繼承表示顏色等屬性,直接加欄位。
- 類別路徑唯一性:同名類別僅出現一次,避免編譯器誤載入。
- AWT 事件適配器拼寫陷阱:覆寫方法名拼錯不會報錯,只會新增方法導致失效。
- 消除「偽單例」:需單例時用 Enum 或靜態工廠實作,勿靠註解約束。
- 防分析癱瘓:先掌握全局再鑽細節,避免陷入死邏輯。
- 拒絕過早優化:先跑通、再測量、有瓶頸才優化;代價是可讀性與維護性下降。
- 程式碼給人讀:閱讀時間遠超撰寫;清晰設計、詳細註解、範例代碼價值無可估量。
- 同儕審查:邀請跨領域同事用新眼光找盲點,早發現低成本修正。
- 良好設計回報最高:前期投入找正確抽象,後續事半功倍;拒絕草率完工。
總結
這 30 條建議涵蓋命名、封裝、繼承、異常、資源管理、效能、團隊協作等面向,貫徹「簡單、清晰、可維護」核心價值。內化為習慣,代碼品質自會躍升。