首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JavaBean 四大屬性類型深度解析:Simple、Indexed、Bound 與 Constrained

     編輯:Java 相關知識

前言

JavaBean 規範定義了四種屬性類型,依據功能與行為差異分為:Simple(簡單)、Indexed(索引)、Bound(綁定)、Constrained(約束)屬性。理解這四類屬性的差異,是設計高品質可重用元件的關鍵。

1. Simple 屬性(簡單屬性)

最基本的屬性型態,對應一對 getter/setter 方法的單一變數。命名慣例:

  • getPropertyName() / setPropertyName(Type value)
  • 布林屬性可使用 isPropertyName() 作為 getter

程式碼範例

public class SimpleBean {
    private String ourString = "Hello";  // 屬性名:ourString
    
    public String getOurString() { return ourString; }
    public void setOurString(String newString) { ourString = newString; }
}

開發工具透過內省機制自動識別此屬性,並顯示在屬性視窗中供設計時設定。

2. Indexed 屬性(索引屬性)

代表陣列或集合類型的屬性,提供存取整個陣列或單一元素的方法:

  • getPropertyName() / setPropertyName(Type[] values) - 存取整個陣列
  • getPropertyName(int index) / setPropertyName(int index, Type value) - 存取單一元素

程式碼範例

public class IndexedBean {
    private int[] dataSet = {1, 2, 3, 4, 5, 6};
    
    public int[] getDataSet() { return dataSet; }
    public void setDataSet(int[] x) { dataSet = x; }
    
    public int getDataSet(int index) { return dataSet[index]; }
    public void setDataSet(int index, int x) { dataSet[index] = x; }
}

適用於表格資料、清單項目等需索引存取的情境。

3. Bound 屬性(綁定屬性)

當屬性值變更時,自動發送 PropertyChangeEvent 通知已註冊的監聽器。核心機制:

  • 使用 PropertyChangeSupport 管理監聽器清單
  • 在 setter 中呼叫 firePropertyChange("propertyName", oldValue, newValue)
  • 提供 addPropertyChangeListener / removePropertyChangeListener 註冊介面

程式碼範例

public class BoundBean {
    private String ourString = "Hello";
    private PropertyChangeSupport changes = new PropertyChangeSupport(this);
    
    public void setOurString(String newString) {
        String oldString = ourString;
        ourString = newString;
        changes.firePropertyChange("ourString", oldString, newString); // 發送事件
    }
    
    public void addPropertyChangeListener(PropertyChangeListener l) {
        changes.addPropertyChangeListener(l);
    }
    public void removePropertyChangeListener(PropertyChangeListener l) {
        changes.removePropertyChangeListener(l);
    }
}

應用場景

元件間資料同步,例如:按鈕背景色變更時,對話框背景色同步更新。

4. Constrained 屬性(約束屬性)

屬性變更前需經過監聽器驗證,監聽器可拋出 PropertyVetoException 否決變更。雙重機制:

  • VetoableChangeSupport:管理否決監聽器,呼叫 fireVetoableChange
  • PropertyChangeSupport:變更成功後發送一般變更通知

程式碼範例

public class ConstrainedBean {
    private int priceInCents = 0;
    private PropertyChangeSupport changes = new PropertyChangeSupport(this);
    private VetoableChangeSupport vetos = new VetoableChangeSupport(this);
    
    public void setPriceInCents(int newPrice) throws PropertyVetoException {
        int oldPrice = priceInCents;
        // 1. 先發送否決事件,監聽器可拋出 PropertyVetoException
        vetos.fireVetoableChange("priceInCents", oldPrice, newPrice);
        // 2. 若無異常,更新值並發送一般變更事件
        priceInCents = newPrice;
        changes.firePropertyChange("priceInCents", oldPrice, newPrice);
    }
    
    // 註冊/移除否決監聽器
    public void addVetoableChangeListener(VetoableChangeListener l) { vetos.addVetoableChangeListener(l); }
    public void removeVetoableChangeListener(VetoableChangeListener l) { vetos.removeVetoableChangeListener(l); }
}

應用場景

商業規則驗證,例如:價格不得低於成本、庫存不得為負數等約束條件。

比較總結表

屬性類型核心特徵支援類別典型應用
Simple單一值、基本 getter/setter無特殊需求一般屬性設定
Indexed陣列/集合、支援索引存取無特殊需求表格資料、清單
Bound值變更發送 PropertyChangeEventPropertyChangeSupport元件間資料同步
Constrained值變更前需通過驗證,可被否決VetoableChangeSupport + PropertyChangeSupport商業規則驗證

結語

善用這四種屬性類型,能讓 JavaBean 元件具備豐富的互動行為:Simple 提供基本存取、Indexed 處理集合資料、Bound 實現元件聯動、Constrained 強制商業規則。實務開發中常組合使用,例如:一個 Indexed 屬性同時也是 Bound 與 Constrained 的,可構建功能強大的資料模型元件。

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