JavaBeans 規範定義四種屬性類型,透過命名慣例與特定介面實作,賦予屬性不同的語意與行為,支援視覺化建構工具的屬性表編輯、事件連結與約束驗證。
單一值屬性,配對 getX()/setX() 方法。布林屬性可用 isX() 替代 getX()。
public class Alden1 extends Canvas {
private String ourString = "Hello";
public String getString() { return ourString; }
public void setString(String newString) { ourString = newString; }
}
陣列或 List 型別屬性,提供單元存取與整體存取的重載方法。
public class Alden2 extends Canvas {
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 通知已註冊監聽器,支援元件間屬性同步 (如按鈕背景色變更同步對話框背景色)。
public class Alden3 extends Canvas {
private String ourString = "Hello";
private PropertyChangeSupport changes = new PropertyChangeSupport(this);
public String getString() { return ourString; }
public void setString(String newString) {
String old = ourString;
ourString = newString;
changes.firePropertyChange("ourString", old, newString); // 發送事件
}
// 設計工具註冊/移除監聽器
public void addPropertyChangeListener(PropertyChangeListener l) {
changes.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l) {
changes.removePropertyChangeListener(l);
}
}
屬性值變更前發送 VetoableChangeEvent,監聽器可拋出 PropertyVetoException 否決變更。需同時維護 PropertyChangeSupport (變更後通知) 與 VetoableChangeSupport (變更前驗證)。
public class JellyBean extends Canvas {
private int priceInCents = 0;
private PropertyChangeSupport changes = new PropertyChangeSupport(this);
private VetoableChangeSupport vetos = new VetoableChangeSupport(this);
public int getPriceInCents() { return priceInCents; }
public void setPriceInCents(int newPrice) throws PropertyVetoException {
int old = priceInCents;
vetos.fireVetoableChange("priceInCents", old, newPrice); // 可能拋出 Veto
priceInCents = newPrice;
changes.firePropertyChange("priceInCents", old, newPrice); // 確認變更
}
public void addVetoableChangeListener(VetoableChangeListener l) {
vetos.addVetoableChangeListener(l);
}
public void removeVetoableChangeListener(VetoableChangeListener l) {
vetos.removeVetoableChangeListener(l);
}
// PropertyChangeListener 註冊方法同 Bound Property
}
| 屬性類型 | 關鍵介面/類別 | 事件 | 用途 |
|---|---|---|---|
| Simple | get/set 慣例 | 無 | 基本資料保存 |
| Indexed | get/set 重載 (含 index) | 無 | 陣列/集合元素存取 |
| Bound | PropertyChangeSupport | PropertyChangeEvent | 屬性同步、UI 聯動 |
| Constrained | VetoableChangeSupport | VetoableChangeEvent | 驗證/審核機制 (如價格上限) |