在 JavaBeans 規範中,「屬性」的概念與一般 Java 類別中的成員變數(Field)或物件導向語言中的物件屬性同義,具體對應到類別中的變數。依據功用不同,JavaBeans 將屬性細分為四大類:Simple(簡單)、Indexed(索引)、Bound(繫結)與 Constrained(約束)屬性。掌握這四種屬性的特性與實作方式,是開發符合規範、可被建構工具識別的元件關鍵。
Simple 屬性對應單一數值,並遵循標準的 get/set 命名慣例。屬性名稱由方法名推導而來:若存在 getX() 與 setX(),即暗示有一名為 "X" 的屬性;若為 isX(),則通常代表布林屬性。
public class AldenBean extends Canvas {
private String ourString = "Hello"; // 屬性名 ourString,型別 String
public AldenBean() {
setBackground(Color.red);
setForeground(Color.blue);
}
// 設值方法
public void setString(String newString) {
ourString = newString;
}
// 取值方法
public String getString() {
return ourString;
}
}
此範例展示了標準的 Simple 屬性封裝:私有欄位配合公用存取器,確保資料封裝與工具識別。
Indexed 屬性代表一組有序值(陣列或 List),提供兩種存取模式:整體存取(一次設定/取得完整陣列)與單元素存取(透過索引操作特定元素)。
public class DataBean extends Canvas {
private int[] dataSet = {1, 2, 3, 4, 5, 6};
public DataBean() {
setBackground(Color.red);
setForeground(Color.blue);
}
// 整體設定/取得
public void setDataSet(int[] x) { dataSet = x; }
public int[] getDataSet() { return dataSet; }
// 單元素設定/取得
public void setDataSet(int index, int x) { dataSet[index] = x; }
public int getDataSet(int index) { return dataSet[index]; }
}
建構工具透過方法簽章辨識 Indexed 屬性:setX(int[], ...) 與 setX(int, ...) 共存即視為索引屬性。
Bound 屬性在數值變更時會觸發 PropertyChangeEvent,通知所有已註冊的監聽器(Listener)。事件物件封裝了屬性名稱、舊值與新值。此機制支援元件間的資料同步,例如按鈕背景色變更時,對話框背景色自動跟隨更新。
public class BoundBean extends Canvas {
private String ourString = "Hello";
private final PropertyChangeSupport changes = new PropertyChangeSupport(this);
public void setString(String newString) {
String oldString = ourString;
ourString = newString;
// 觸發屬性變更事件
changes.firePropertyChange("ourString", oldString, newString);
}
public String getString() { return ourString; }
// 供建構工具註冊/移除監聽器
public void addPropertyChangeListener(PropertyChangeListener l) {
changes.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l) {
changes.removePropertyChangeListener(l);
}
}
關鍵點:
PropertyChangeSupport 管理監聽器清單與事件分發firePropertyChange 方法參數依序為:屬性名、舊值、新值add/removePropertyChangeListener 供外部工具掛接Constrained 屬性延伸 Bound 機制,允許監聽器透過拋出 PropertyVetoException 否決變更。實作時需改用 VetoableChangeSupport 並拋出受檢異常,確保關鍵屬性變更受嚴格控管。
| 屬性類型 | 核心特徵 | 適用場景 |
|---|---|---|
| Simple | 單值、標準 get/set | 一般資料欄位 |
| Indexed | 陣列/集合、雙重存取介面 | 表格資料、多值設定 |
| Bound | 變更觸發 PropertyChangeEvent | UI 同步、資料綁定 |
| Constrained | 可否決變更、拋出 Veto 異常 | 關鍵設定、權限控制 |
遵循 JavaBeans 命名慣例與事件模型,不僅能讓元件在視覺化建構工具中正確運作,也奠定了現代 Java 框架(如 Spring、JavaFX)屬性綁定與依賴注入的基礎。