習慣の生き物

私はJavaでオブザーバを実装する場合、Observable/Observerではなくイベントリスナを使う。
イベントリスナのパターンを既存のクラスに追加するには

1. イベントリスナ・インタフェースを作成

public interface IHogeListener extends EventListener {
    void hoge(HogeEvent event);
}

2. イベントオブジェクトを作成

public class HogeEvent extends EventObject {
    private static final long serialVersionUID = 1L;
    public HogeEvent(IHogeListener source) {
        super(source);
    }
    IHogeListener getHogeListener() {
        return (IHogeListener)this.getSource();
    }
}

3. リスナ登録/破棄インタフェース、又はそれらのメソッドを実装したクラスを作成

public interface IHoge {
    void addHogeListener(IHogeListener listener);
    void removeHogeListener(IHogeListener listener);
}

まあ、インタフェースにするか否かは好みだが、とりあえずここまで来てやっとリスナを使える。

public class HogeImpl implememnts IHoge {
    EventListenerList listenerList;
    public HogeImpl() {
        super();
        this.listenerList = new EventListenerList();
    }
    public void addHogeListener(IHogeListener listener) {
        this.listenerList.add(IHogeListener.class, listener);
    }
    public void removeHogeListener(IHogeListener listener) {
        this.listenerList.remove(IHogeListener.class, listener);
    }
:
:
    protected void notifyHogeEvent(HogeEvent event) {
        for (IFooListener listener : listenerList.getListeners(IHogeListener.class)) {
            listener.hoge(event);
        }
    }
}

冗長なのでやってらんないはずなんだが、気がつくとまたこの実装をしている。

なぜObservable/Observerを使わないんだろうかを考えてみたのだが、良い言い訳を思いつかない。"〜Observable(Observer)"よりも"〜Listener"のほうがしっくりくるからか? ObservableとObserverのどっちが監視/被監視か解らなくなるからか?