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

JavaBeans 開發規範詳解:四大屬性模式與事件通知機制

     編輯:Java 相關知識

JavaBeans 是 Java 組件模型基石,其屬性設計遵循嚴格命名約定,支援構建工具的可視化組裝。本文系統闡述 Simple、Indexed、Bound、Constrained 四類屬性模式與 PropertyChange 事件機制,附完整代碼範例。

屬性分類與約定

代碼範例:Bound 屬性完整實現

public class PersonBean implements Serializable {
    private String name = "Unknown";
    private final PropertyChangeSupport changes = new PropertyChangeSupport(this);

    public String getName() { return name; }

    public void setName(String newName) {
        String oldName = this.name;
        this.name = newName;
        // 觸發屬性變更事件:屬性名、舊值、新值
        changes.firePropertyChange("name", oldName, newName);
    }

    // 構建工具註冊監聽器的標準介面
    public void addPropertyChangeListener(PropertyChangeListener l) {
        changes.addPropertyChangeListener(l);
    }
    public void removePropertyChangeListener(PropertyChangeListener l) {
        changes.removePropertyChangeListener(l);
    }
}

Constrained 屬性:可否決的變更

public void setAge(int newAge) throws PropertyVetoException {
    int oldAge = this.age;
    // 觸發否決檢查
    changes.fireVetoableChange("age", oldAge, newAge);
    this.age = newAge;  // 無否決才真正賦值
    changes.firePropertyChange("age", oldAge, newAge);
}

監聽器實現 VetoableChangeListener,在 vetoableChange() 中拋出 PropertyVetoException 即可阻止變更。

設計工具整合要點

  • BeanInfo 類(可選)提供圖示、屬性描述符、事件集描述符,增強可視化編輯體驗。
  • 屬性編輯器(PropertyEditor)支援複雜類型(顏色、字體、日期)在屬性表中編輯。
  • 持久化:java.beans.XMLEncoder/Decoder 可將 Bean 圖序列化為 XML,適合配置存儲。

最佳實踐

  1. 屬性名與方法名嚴格對應(大小寫敏感),構建工具依靠內省發現屬性。
  2. Bound/Constrained 事件源委託給 PropertyChangeSupport,線程安全、標準化。
  3. 不可變屬性僅提供 getter,構造器注入,避免多線程競態。
  4. 大量屬性變更考慮批量通知或延遲觸發,減少 UI 重繪風暴。

掌握 JavaBeans 規範,不僅能編寫工具友好的組件,更能深入理解 Spring Bean、JSF Managed Bean 等現代框架組件模型的設計淵源。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
類型定義方法模式典型場景
Simple單一值屬性getX()/setX() 或 isX()/setX() (boolean)名稱、狀態、配置參數
Indexed有序集合/數組getX(int i)/setX(int i, T val) + getX()/setX(T[])列表、表格數據、多值屬性
Bound變更需通知監聽器Simple 模式 + add/removePropertyChangeListenerUI 綁定、模型同步、配置熱更新
Constrained變更可被否決Bound 模式 + add/removeVetoableChangeListener + setX() throws PropertyVetoException不可變約束、業務規則驗證、事務性屬性