// 危險
public class Base {
public Base() { initialize(); } // 可被覆蓋
protected void initialize() { ... }
}
public class Derived extends Base {
private final List items = new ArrayList<>();
@Override protected void initialize() { items.add("init"); } // Base 構造器執行時 items 尚未初始化!NPE
}
規則:構造器僅調用 private/final/static 方法,或不調用任何實例方法。
貧血模型:User { String name; } + UserService.changeName()
豐血模型:User { void changeName(String n) { ... } } — 封裝不變量、業務規則在對象內部。
繼承 = 白盒復用 (破壞封裝、父類變動波及子類)。組合 = 黑盒復用。策略模式、裝飾器模式是組合典範。
反例:RedCar/BlueCar extends Car → 正確:Car { Color color; }。繼承表達「是一種」行為專業化,非顏色/尺寸屬性變化。
編譯器按順序採用首個同名類。排查:find $CLASSPATH -name "ClassName.class"。模塊化 (JPMS) 從根本解決。
windowClosing 寫錯 → 新增方法而非覆蓋 → 無編譯錯誤但不生效。解決:@Override 註解 (強制編譯器驗證覆蓋關係)。
public enum Singleton { INSTANCE; } // 防反射、防序列化破壞、線程安全、代碼最少
先全局後局部。架構宏觀把握 → 關鍵細節深入。避免在未知細節中無限循環。
功能正確 → Profiling 定位熱點 → 僅優化證實瓶頸。代價:可讀性/可維護性下降。
註釋、命名、示例、ADR (架構決策記錄)。可讀性投資回報率最高。
邀請領域外同事審查。發布前發現缺陷成本 << 發布後。
前期投入尋找正確抽象,後期輕鬆。抵制「先跑通再重構」 — 技術債務利息極高。
這 30 條指導涵蓋 語法細節 → 類設計 → 工程實踐 → 架構哲學 完整鏈路。核心三線索:可讀性優先、封裝變化點、延遲決策直到有足夠信息。建議團隊內化為 Code Review 清單、Checkstyle/SpotBugs 規則、新人培訓教材,持續沉澱工程文化。