習慣の生き物
私は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のどっちが監視/被監視か解らなくなるからか?