命名與基本規範
- 命名慣例:類名首字母大寫;欄位、方法、物件參考首字母小寫;多單詞駝峰式(
ThisIsAClassName, thisIsMethodOrFieldName);static final 基本型別常數全大寫;套件名全小寫(含域名擴展如 com、org)。
- 經典類別形式:為通用目的建立類別時,實作
equals()、hashCode()、toString()、clone()(實作 Cloneable)、實作 Serializable。
- 內建測試:每個類別置入
main() 含測試代碼,方便回歸測試與示範用法。
方法與類別設計
- 方法簡潔單一:描述並實現一個離散的類別介面部分;過長則拆分,促進重用。
- 以客戶程式設計師為中心:使用方式明確;再考慮維護者,預測修改點並簡化。
- 類別短小精悍:僅解決一個特定問題。複雜 switch → 多型;大量涉及型別差異操作 → 多類別;成員變數特徵差異大 → 多類別。
- 極致封裝:盡可能
private。僅公開必要部分,才能放心修改內部。多執行緒環境下 private 欄位受保護。
- 避免「巨大物件綜合症」:新手常寫成順序程式塞進一兩個巨大物件。物件應表達應用概念,非應用本身。
- 醜陋代碼內部化:不得已的醜陋代碼放入類別內部。
- 內部類別改善耦合:類別間過度緊密時,考慮內部類別改善編碼與維護。
文檔與細節
- 詳細註解:使用 Javadoc 語法生成文檔。
- 拒絕魔術數字:建立具描述性名稱的常數,提升可讀性與維護性。
- 建構子異常處理:建構子捕獲異常應重新拋出,避免調用者誤以為物件建立成功。
- 清理方法規範:需清理時提供
cleanup() 等明確命名方法;以 boolean 標記清理狀態;finalize() 中檢查並拋出 RuntimeException 子類別指示程式錯誤(需確認 finalize() 能運作)。
- 確定性清理模式:特定作用域必須清理時:初始化 → 成功即進入
try-finally 進行清理。
- finalize() 覆寫規則:最後調用
super.finalize(),確保基礎類別組件仍有效。
- 固定大小集合用陣列:享受編譯期型別檢查,接收者無需強制轉型。
- 優先介面而非抽象類:已知將成基礎類首選介面;非得用方法定義或成員變數才用抽象類。介面描述「做什麼」,類別實現「怎麼做」。
- 建構子僅做初始化:避免調用其他方法(可能被覆寫導致不可預知結果)。
- 物件行為良好定義:不僅容納資料。
- 組合優於繼承:基於現成類建新類首選「新建/組合」;設計要求必須繼承時才用繼承,否則設計變得不必要複雜。
這 20 條建議涵蓋命名、設計、文檔、細節處理與核心原則,遵循能顯著提升代碼品質與團隊協作效率。