代碼示例回顧
public class Xiangqi {
protected String strName;
protected int nAge;
protected int nSex; // 1 男 0 女
public Xiangqi(String name, int age, int sex) { ... }
public String getName() { return strName; }
public int getAge() { return nAge; }
public int getSex() { return nSex; }
// 問題:這些 setter 有什麼用?可以不寫嗎?
public void setName(String name) { strName = name; }
}
Setter/Getter 的核心價值
1. 封裝性——面向對象的基石
- 隱藏內部實現:外部不直接訪問字段,通過方法間接訪問
- 控制訪問權限:可單獨設置
public get / private set 實現只讀屬性
- 添加驗證邏輯:
public void setAge(int age) {
if (age < 0 || age > 150) throw new IllegalArgumentException("年齡非法");
this.nAge = age;
}
2. 框架兼容性——企業級開發必備
| 框架/場景 | 依賴機制 | 無 Setter/Getter 後果 |
| Spring MVC | 表單綁定 | 參數無法自動映射到實體 |
| MyBatis/Hibernate | 反射賦值 | 實體屬性全為 null |
| JSON 序列化 | Jackson/Gson 反射 | 無法序列化/反序列化 |
| Lombok @Data | 編譯期生成 | 需加註解,本質仍生成方法 |
3. 可維護性與擴展性
- 未來需添加日誌、緩存、事件通知時,只需修改方法內部
- 接口穩定:修改內部存儲結構(如改用 Map)不影響調用方
- 支持只讀/寫入驗證/延遲加載等高級模式
什麼時候可以省略?
| 場景 | 建議 | 理由 |
| 純內部工具類 | 可用 public 字段 | 無框架依賴、生命周期短 |
| DTO/VO 僅作數據傳輸 | 建議加上或用 Lombok | 框架需反射訪問 |
| 不可變對象 | 僅 Getter + 構造器賦值 | 線程安全、領域驅動設計 |
| 測試代碼/腳本 | 可省略 | 一次性代碼 |
現代最佳實踐
方案一:Lombok 註解(主流)
@Data // 包含 @Getter @Setter @ToString @EqualsAndHashCode @RequiredArgsConstructor
@AllArgsConstructor
@NoArgsConstructor
public class Xiangqi {
private String name;
private int age;
private int sex;
}
編譯期自動生成,源碼乾淨,IDE 支持完美。
方案二:Record(Java 14+)
public record Xiangqi(String name, int age, int sex) {
// 自動擁有:構造器、getter、equals、hashCode、toString
// 默認不可變,適合 DTO
}
方案三:手寫規範模板
- 字段
private
- Getter
public
- Setter
public(可變)或 private/無(不可變)
- 布爾型 Getter 命名
isXxx()
總結
個人練習可省略,項目代碼必須寫。 Setter/Getter 不是形式主義,而是封裝性、框架兼容、可維護性的基礎保障。現代開發請直接用 @Data 或 record,一行代碼解決所有樣板代碼問題。
- 上一篇文章: Android 內部類別中註冊 Listener:正確傳遞外部類別 this 引用
- 下一篇文章: iOS UITextField 雙欄位驗證:同時有內容顯示 Alert、否則繼續流程
Copyright ©
程式碼之家 All Rights Reserved