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

Java Getter/Setter 存在的意義:封裝、驗證與演進

     編輯:程式設計綜合問答

為什麼不直接存取 public field?

初學者常覺得 obj.field = value; 比 obj.setField(value); 簡單。但直接暴露欄位會導致:

  1. 無法攔截賦值邏輯:日後需加入非空檢查、範圍驗證、觸發事件、記錄審計日誌等,若為 public field,所有呼叫端都必須修改。
  2. 破壞封裝:內部表示 (如改用 Map、計算屬性、延遲載入) 無法在不改動呼叫端的情況下變更。
  3. 無法實現唯讀/寫入權限控制:只能全開或全關。
  4. 序列化/框架相容性:Jackson、Hibernate、Spring 等主流框架依賴 Getter/Setter 慣例。

標準範例:驗證邏輯內建

public class User {
    private String email;
    private int age;

    public String getEmail() { return email; }

    public void setEmail(String email) {
        if (email == null || !email.contains("@")) {
            throw new IllegalArgumentException("Invalid email format");
        }
        this.email = email.toLowerCase(); // 正規化
    }

    public int getAge() { return age; }

    public void setAge(int age) {
        if (age < 0 || age > 150) {
            throw new IllegalArgumentException("Age out of range");
        }
        this.age = age;
    }
}

現代簡化寫法

  • Lombok @Data / @Getter / @Setter: 編譯期自動生成,原始碼極度精簡。
  • Java 14+ Record: public record User(String email, int age) {} 自動提供 email(), age()、建構子、equals/hashCode/toString,預設不可變,適合資料傳輸物件 (DTO)。
  • Builder 模式: 複雜物件建構時提供流暢 API。

何時可用 public field?

  • 單純的資料結構 (Struct-like),無行為、無驗證、極少變更、包內部使用 (如 java.awt.Point)。

結論:Getter/Setter 不是為了當下的「驗證代碼」,而是為了未來的「可維護擴充性」。現代開發配合 Lombok 或 Record 可兼顧簡潔與封裝。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved