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

JavaBeans 規範完整指南:屬性、事件、持久化與 Introspection 機制

     編輯:Java 相關知識

什麼是 JavaBean?

符合特定慣例的可重用軟體元件,核心契約:

  1. 實作 java.io.Serializable(支援持久化)。
  2. 提供無參數建構子。
  3. 屬性透過 getXxx()/setXxx() 存取(Boolean 可用 isXxx())。
  4. 事件遵循「監聽器模式」:addXxxListener()/removeXxxListener()。

Introspection(內省)機制

建構工具(Eclipse VE、NetBeans Matisse、IntelliJ GUI Designer)在設計期自動發現 Bean 特徵:

  • 命名模式掃描:Introspector 透過反射偵測 get/set、add/removeListener。
  • BeanInfo 類別:可選,显式提供屬性/事件/方法描述子,覆蓋預設掃描結果。

屬性

事件模型

// 1. 事件物件(繼承 EventObject)
public class TemperatureChangedEvent extends EventObject {
    private final double newTemp;
    public TemperatureChangedEvent(Object source, double newTemp) { ... }
    public double getNewTemperature() { return newTemp; }
}

// 2. 監聽器介面(繼承 EventListener)
public interface TemperatureListener extends EventListener {
    void temperatureChanged(TemperatureChangedEvent e);
}

// 3. 事件源(Bean)註冊管理
public class Thermometer implements Serializable {
    private double temp;
    private final List listeners = new ArrayList<>();

    public void addTemperatureListener(TemperatureListener l) { listeners.add(l); }
    public void removeTemperatureListener(TemperatureListener l) { listeners.remove(l); }

    public void setTemperature(double t) {
        double old = this.temp;
        this.temp = t;
        // 通知所有監聽器
        TemperatureChangedEvent evt = new TemperatureChangedEvent(this, t);
        for (TemperatureListener l : listeners) l.temperatureChanged(evt);
    }
}
  • 命名慣例:事件名 TemperatureChanged → 監聽器 TemperatureListener、方法 temperatureChanged、註冊 add/removeTemperatureListener。
  • AWT/Swing 內建事件:ActionEvent/ActionListener、MouseEvent/MouseListener 等,直接複用。

持久化

  • 標準機制:Java 序列化(ObjectOutputStream 寫入檔案/資料庫)。
  • 長期儲存建議:XML 編碼(XMLEncoder/XMLDecoder)或 JSON(Jackson/Gson),避免 serialVersionUID 版本衝突。
  • Transient 欄位:transient 標記不序列化(如資料庫連線、執行緒池)。

在 IDE 中使用 JavaBean

  1. 從調色盤拖入 Bean 到表單。
  2. 屬性視窗編輯屬性(綁定屬性即時反映)。
  3. 事件頁籤雙擊事件 → 自動產生監聽器程式碼骨架。
  4. 多 Bean 連線:按鈕 actionPerformed → 觸發資料庫 Bean query() → 更新表格 Bean setModel()。

常見誤區

  • 以為 public 欄位就是屬性 → 錯,必須有 getter/setter。
  • 忘記 Serializable → 無法持久化、無法在分散式環境傳遞(RMI/EJB)。
  • 事件來源未同步註冊清單 → 多執行緒環境下 ConcurrentModificationException(建議用 CopyOnWriteArrayList)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
類型讀取器寫入器範例
一般Type getProperty()void setProperty(Type)getName() / setName(String)
Booleanboolean isProperty() 或 getProperty()void setProperty(boolean)isEnabled() / setEnabled(boolean)
索引Type getProperty(int)void setProperty(int, Type)getItem(int) / setItem(int, Object)
綁定屬性變更觸發 PropertyChangeEvent需手動 firePropertyChange()
受限變更前觸發 VetoableChangeEvent,可攔截罕用