首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 類中 Setter/Getter 方法的作用與是否必寫的深度解析

     編輯:程式設計綜合問答

代碼示例回顧

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. 框架兼容性——企業級開發必備

3. 可維護性與擴展性

  • 未來需添加日誌、緩存、事件通知時,只需修改方法內部
  • 接口穩定:修改內部存儲結構(如改用 Map)不影響調用方
  • 支持只讀/寫入驗證/延遲加載等高級模式

什麼時候可以省略?

框架/場景依賴機制無 Setter/Getter 後果
Spring MVC表單綁定參數無法自動映射到實體
MyBatis/Hibernate反射賦值實體屬性全為 null
JSON 序列化Jackson/Gson 反射無法序列化/反序列化
Lombok @Data編譯期生成需加註解,本質仍生成方法

現代最佳實踐

方案一: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,一行代碼解決所有樣板代碼問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景建議理由
純內部工具類可用 public 字段無框架依賴、生命周期短
DTO/VO 僅作數據傳輸建議加上或用 Lombok框架需反射訪問
不可變對象僅 Getter + 構造器賦值線程安全、領域驅動設計
測試代碼/腳本可省略一次性代碼