前言:好代碼是養出來的 — 三十條經驗萃取
這三十條規則源自《Java 程式設計技巧》等經典實戰總結,涵蓋**命名規範、類設計、方法設計、封裝、異常處理、資源管理、繼承與組合、介面導向、構造器、測試、文檔、優化、團隊協作、架構思維**。非教條,而是**避坑指南與品質基線**。內化為肌肉記憶,代碼自然整潔、健壯、可演進。
規則全景 (分類精要版)
📝 命名與格式 (1, 12)
- 類名 PascalCase,方法/變數/物件 camelCase,常數全大寫下劃線:`UserService`, `getUserById`, `MAX_RETRY_COUNT`。包名全小寫 `com.company.project`。
- 拒絕魔術數字:`if (status == 2)` → `if (status == OrderStatus.PAID.getCode())`。常數賦予語義,便於維護。
🏗️ 類設計核心原則 (2, 5, 6, 8, 10, 17, 18, 20, 21, 22, 25)
- 經典類模板:實作 `equals/hashCode` (業務鍵一致性)、`toString` (除錯友好)、`clone` (謹慎、可複製介面)、`Serializable` (跨進程/持久化需求)。
- 為客戶程式設計師設計 (API 易用性):方法名自述、參數少、預設值合理、拒絕驚喜 (最小驚訝原則)。再為維護者設計 (變化點隔離、擴展點預留)。
- 單一職責:類小而專:複雜 switch → 多態;方法涉及多類型操作 → 拆分類;成員變數特徵差異大 → 拆分類。
- 極小化公開 API:**默認 `private`**,按需放寬。`public` 一旦發布,**永不收回** (破壞二進制兼容)。多執行緒下 `private` 保護非同步訪問安全。
- 內部類改善緊耦合:兩類高度耦合 → 考慮內部類封裝實現細節。
- 陣列優於集合作為固定大小返回值:編譯期類型檢查、調用者無需轉型。集合用於可變長度。
- 介面優於抽象類:定義「做什麼」而非「怎麼做」。只有需共享代碼/狀態時才用 `abstract class`。Java 8+ `default method` 模糊邊界但原則不變。
- 物件須有行為:純資料容器 (DTO/VO) 除外,領域物件封裝業務邏輯 (Tell, Don't Ask)。
- 組合優於繼承:需求變化時組合靈活,繼承脆弱 (破壞封裝、耦合父類實現)。「是」關係才繼承,「有」關係用組合。
- 字段表示狀態差異,繼承表示行為差異:顏色用 `Color` 字段,別搞 `RedCar`/`BlueCar` 繼承體系。
- 單例/受控實例化封裝:需單例 → `enum Singleton` / 靜態工廠 + 私有構造器,**別靠註解「只創建一個」**。
⚙️ 方法與構造器規範 (4, 13, 14, 15, 16, 19)
- 方法短小、單一功能:超過一屏 → 拆分。便於復用、測試、命名。
- 構造器只做初始化:不調用可覆寫方法 (防止子類構造前執行邏輯訪問未初始化字段)、不啟動執行緒、不做遠程調用、不做重 IO。複雜初始化用靜態工廠方法。
- 構造器異常處理:失敗快速、拋出檢查異常:創建失敗 → 拋異常阻止物件誕生,調用者不會誤以為成功。
- 資源清理模式:try-with-resources (Java 7+):
try (Resource r = acquire()) { use(r); } // 自動 close,異常也安全
取代手動 `finally` + `close()`。實作 `AutoCloseable`。
- `finalize()` 已棄用 (JDK 9) / 移除 (JDK 18+):勿用** 改用 `Cleaner` / `PhantomReference` / `try-with-resources` / 顯式 `close()`。
- 構造器鏈調用 `super(...)` / `this(...)` 必須首行:父類構造先完成,子類才能安全使用繼承字段。
🛡️ 異常與錯誤處理 (13, 27)
- 檢查異常用於可恢復業務錯誤,運行時異常用於程式錯誤 (Bug):別濫用檢查異常汙染 API,別吞沒異常 (`catch {}`)。
- 過早優化是萬惡之源:先跑通、正確、可測。**性能瓶頸用 Profiler (JProfiler/Arthas/async-profiler) 定位**,數據驅動優化。優化代價:可讀性下降、維護成本升。
📚 文檔與團隊協作 (11, 26, 28, 29)
- Javadoc 文檔公共 API:`@param` `@return` `@throws` `@see` `@since` `@deprecated`。IDE 懸浮提示、生成站點文檔。**文檔即契約**。
- 警惕分析癱瘓:先掌握全局 (架構/業務流/技術棧),再鑽細節。全局視角防陷入死邏輯。
- 代碼閱讀時間 >> 編寫時間:寫給人看,附帶能跑。清晰命名、結構分層、關鍵註釋、範例測試 — **對未來的自己與同事負責**。
- 代碼評審 (Code Review) 引入外部視角:非專家也行,新鮮眼光發現盲區。**越早發現問題,修復成本指數級下降**。
🎯 架構與長期主義 (23, 24, 27, 30)
- 類路徑唯一性:同名類只能出現一次。衝突 → `NoClassDefFoundError` / 詭異行為。排查:搜尋所有 `.class`/JAR 定位重複。
- 匿名內部類 / Lambda 陷阱:覆寫介面方法時拼寫錯誤 → **新增方法而非覆寫**,編譯不報錯、運行失效。**`@Override` 註解強制編譯器校驗,必加**。
- 良好的設計回報最高:前期投入分析設計 (DDD 戰略/戰術、架構決策記錄 ADR),後期開發順暢、擴展從容。**拒絕草率完工**,技術債務複利增長終將反噬。
現代補充:三十條之外的新基線 (JDK 17/21 時代)
- Record (JDK 16+) 取代樣板 DTO/VO:`record User(String name, int age) {}` 自動生成構造器、getter、equals/hashCode/toString、不可變。
- Sealed Class (JDK 17+) 受控繼承體系:`sealed interface Expr permits Const, Add, Mul {}` 精確建模代數資料類型。
- Pattern Matching (JDK 16+/21) 簡化 instanceof/switch:`if (obj instanceof String s) ...`、`switch (obj) { case String s -> ... }`。
- 虛擬執行緒 (JDK 21+) 重寫高併發模型:`Executors.newVirtualThreadPerTaskExecutor()` 百萬級並發無池化壓力,同步風格代碼跑出異步效能。
- 模組系統 (JPMS) 強封裝:`module-info.java` 導出/開放精確包,**內部 API 默認不可訪問**,框架需 `--add-opens` 顯式開放。
- 標準化構建:Maven/Gradle Wrapper (`mvnw`/`gradlew`) 保證構建環境一致性。
- 靜態分析進 CI:SpotBugs / PMD / Checkstyle / SonarQube / Error Prone — **編譯期攔截常見缺陷**。
三十條鐵律是**內功心法**,新特性是**利器**。心法貫通,利器隨心。願你代碼整潔、架構清晰、演進從容。