JavaBean 規範定義了四種屬性類型,依據功能與行為差異分為:Simple(簡單)、Indexed(索引)、Bound(綁定)、Constrained(約束)屬性。理解這四類屬性的差異,是設計高品質可重用元件的關鍵。
最基本的屬性型態,對應一對 getter/setter 方法的單一變數。命名慣例:
getPropertyName() / setPropertyName(Type value)isPropertyName() 作為 getterpublic class SimpleBean {
private String ourString = "Hello"; // 屬性名:ourString
public String getOurString() { return ourString; }
public void setOurString(String newString) { ourString = newString; }
}
開發工具透過內省機制自動識別此屬性,並顯示在屬性視窗中供設計時設定。
代表陣列或集合類型的屬性,提供存取整個陣列或單一元素的方法:
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; }
}
適用於表格資料、清單項目等需索引存取的情境。
當屬性值變更時,自動發送 PropertyChangeEvent 通知已註冊的監聽器。核心機制:
PropertyChangeSupport 管理監聽器清單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);
}
}
元件間資料同步,例如:按鈕背景色變更時,對話框背景色同步更新。
屬性變更前需經過監聽器驗證,監聽器可拋出 PropertyVetoException 否決變更。雙重機制:
fireVetoableChangepublic 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 | 值變更發送 PropertyChangeEvent | PropertyChangeSupport | 元件間資料同步 |
| Constrained | 值變更前需通過驗證,可被否決 | VetoableChangeSupport + PropertyChangeSupport | 商業規則驗證 |
善用這四種屬性類型,能讓 JavaBean 元件具備豐富的互動行為:Simple 提供基本存取、Indexed 處理集合資料、Bound 實現元件聯動、Constrained 強制商業規則。實務開發中常組合使用,例如:一個 Indexed 屬性同時也是 Bound 與 Constrained 的,可構建功能強大的資料模型元件。