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

Java 事件處理機制深度解析:從核心組件到分發流程

     編輯:Java 相關知識

事件模型三要素

Java 事件處理遵循「觀察者模式」,包含三大核心角色:

  • 事件對象:繼承 java.util.EventObject,封裝事件源與上下文信息
  • 監聽器接口:繼承 java.util.EventListener,定義回調方法
  • 事件源:維護監聽器集合,提供註冊/移除方法,並在狀態變化時觸發通知

自定義事件示例

// 事件對象
public class PropertyEvent extends EventObject {
    private final String propertyName;
    private final Object oldValue, newValue;

    public PropertyEvent(Object source, String propertyName, Object oldValue, Object newValue) {
        super(source);
        this.propertyName = propertyName;
        this.oldValue = oldValue;
        this.newValue = newValue;
    }
    // getter 省略
}

// 監聽器接口
public interface PropertyListener extends EventListener {
    void propertyChanged(PropertyEvent event);
}

事件源實現:線程安全的分發邏輯

import java.util.*;

public class Exam {
    private int property;
    private final Set listeners = Collections.synchronizedSet(new HashSet<>());

    public void addListener(PropertyListener listener) {
        listeners.add(listener);
    }

    public void removeListener(PropertyListener listener) {
        listeners.remove(listener);
    }

    public void setProperty(int newValue) {
        int oldValue = this.property;
        this.property = newValue;
        firePropertyChange(new PropertyEvent(this, "property", oldValue, newValue));
    }

    private void firePropertyChange(PropertyEvent event) {
        // 複製快照避免迭代時併發修改
        List snapshot;
        synchronized (listeners) {
            snapshot = new ArrayList<>(listeners);
        }
        for (PropertyListener listener : snapshot) {
            listener.propertyChanged(event);
        }
    }
}

監聽器註冊的三種方式

  1. 實現接口:exam.addListener(this); 當前類實現 PropertyListener
  2. 多監聽器:同一事件源可註冊多個獨立監聽器,按註冊順序依次回調
  3. 匿名內部類 / Lambda:
    exam.addListener(event -> {
        System.out.println("屬性變更:" + event.getPropertyName());
    });

進階主題

AWT/Swing 事件調度線程 (EDT)

GUI 事件在 EDT 中分發,監聽器代碼必須快速返回,耗時操作需提交至工作線程(SwingWorker)。

事件總線解耦

大型系統可引入 Guava EventBus、Spring ApplicationEvent 或 MBassador 實現跨組件異步事件傳遞,降低耦合度。

弱引用監聽器防洩漏

使用 WeakReference 包裝監聽器,避免事件源持有強引用導致監聽器無法被 GC 回收。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved