結論
建構子內部推薦直接賦值(this.field = value;),除非 Setter 包含必要的驗證/副作用邏輯。
理由對比
| 方式 | 優點 | 缺點/風險 |
| 直接賦值 | 簡潔、效能高、避免多態調用風險、不觸發副作用 | 重複驗證邏輯(可提取私有方法複用) |
| 調用 Setter | 複用驗證/格式化邏輯、觸發屬性變更事件 | 1. 子類覆寫 Setter 導致建構子調用子類邏輯(字段未初始化) 2. 可能觸發不可預期的副作用(事件、日誌) 3. 稍慢(虛方法調用) |
最佳實踐範例
public class User {
private String name;
private int age;
// 建構子:直接賦值,複用私有驗證方法
public User(String name, int age) {
setNameInternal(name); // 私有方法,不可覆寫
setAgeInternal(age);
}
// 公開 Setter:供外部調用,含驗證
public void setName(String name) {
setNameInternal(name);
}
private void setNameInternal(String name) {
if (name == null || name.trim().isEmpty())
throw new IllegalArgumentException("Name cannot be empty");
this.name = name.trim();
}
// age 同理...
}
關鍵原則
- 建構子、
clone、反序列化等「對象初始化」路徑,使用 private 內部方法賦值。
- 公開 Setter 委派給同一內部方法,確保驗證邏輯單一來源。
- 絕不在建構子中調用可覆寫方法(public/protected),這是 Effective Java 條目 19 強調的核心規則。
遵循此模式,代碼既安全又無重複。
- 上一篇文章: Spring MVC + Hibernate 連接雙資料庫:雙 persistence.xml 與雙 EntityManagerFactory 配置
- 下一篇文章: C 語言二叉樹插入與遍歷 Bug 修復:指針傳遞、遞歸邏輯與記憶體管理
Copyright ©
程式碼之家 All Rights Reserved