PascalCase (如 UserService)camelCase (如 getUserName)static final 基本類型/String):UPPER_SNAKE_CASE (如 MAX_CONNECTIONS)com.company.project.module)通用工具類應實現:
public final class User implements Serializable, Cloneable {
// 字段
// 構造器
// equals() / hashCode() - 基於業務鍵
// toString() - 調試友好
// clone() - 深拷貝
// 實現 Serializable (注意 serialVersionUID)
}
單元測試與示例代碼合二為一,重構時即時驗證,發布前無需刪除 (不影響生產)。
理想 < 20 行,超過 50 行必須拆分。單一功能、單一抽象層級。
識別「上帝類」徵兆並拆分:
private,需要時放寬private 字段天然免疫數據競爭對象表達「領域概念」,而非「整個應用程序」。順序思維產物 → 巨大對象。
不得已的 hack、平台特定代碼、第三方庫適配 → 隔離在具體實現類中,不污染介面。
邏輯緊密、生命週期綁定、需訪問私有狀態 → 非靜態內部類 / 靜態嵌套類。
公共 API 100% 覆蓋:@param, @return, @throws, @see, 示例代碼。
// 錯誤
if (list.size() > 100) ...
// 正確
private static final int MAX_CACHE_SIZE = 100;
if (list.size() > MAX_CACHE_SIZE) ...
構造器捕獲異常 → 包裝拋出,決不吞沒。調用者不應看到「半初始化」對象。
public class ResourceHolder implements AutoCloseable {
private boolean closed = false;
public void close() {
if (!closed) {
// 釋放資源
closed = true;
}
}
@Override protected void finalize() {
if (!closed) {
// 記錄錯誤:程序員忘記調用 close()
throw new IllegalStateException("Resource leak: close() not called");
}
}
}
優先使用 try-with-resources (Java 7+)。
Resource r = acquire();
try {
use(r);
} finally {
r.close(); // 即使 use() 拋出異常也執行
}
放在 最後 執行,確保父類組件仍可用。
編譯期類型檢查、無需造型、效能最優。List.toArray(new T[0]) 返回精確類型陣列。
構造器調用非 final 方法 → 子類覆蓋版本在父構造器中執行 → 訪問未初始化字段 → 錯誤。
貧血模型 → 豐富領域模型。封裝業務邏輯在對象內部。
繼承 = 強耦合 (白盒復用)。組合 = 弱耦合 (黑盒復用)。
反例:RedCar extends Car, BlueCar extends Car → 應為 Car { Color color; }。
編譯器按順序搜索類路徑,首個同名類生效。排查:find /classpath -name "*.class" | grep ClassName。
覆蓋 windowClosing 寫成 windowClosing (大小寫/拼寫錯) → 新增方法而非覆蓋 → 無編譯錯誤但不生效。
// 枚舉單例 (最佳:防序列化破壞、防反射攻擊、線程安全)
public enum Singleton { INSTANCE; }
先掌握全局,再鑽細節。避免在未知細節中陷入死循環。
註釋、清晰命名、示例、架構決策記錄 (ADR) — 投資於可讀性,回報率最高。
新鮮眼光發現盲區。最佳修改階段 = 發布前,而非發布後。
前期投入尋找正確抽象,後期輕鬆愉快。抵制「先跑起來再重構」誘惑 — 技術債務利息極高。
這 30 條建議涵蓋 微觀編碼細節 到 宏觀架構決策,核心貫穿三條主線:可讀性優先、封裝變化點、延遲決策直到有足夠信息。內化為肌肉記憶,代碼質量將質變。