イベントディスパッチャーを使用して、モデルが変更されたときにサブスクライブされたリスナーに通知できるようにしようとしています。イベントディスパッチャは、ディスパッチ中に呼び出すハンドラクラスとメソッド名を受け取ります。プレゼンターはモデルの変更をサブスクライブし、変更時に呼び出されるハンドラー実装を提供します。
これがコードです(少し長いのでごめんなさい)。
EventDispacther:
package utils;
public class EventDispatcher<T> {
List<T> listeners;
private String methodName;
public EventDispatcher(String methodName) {
listeners = new ArrayList<T>();
this.methodName = methodName;
}
public void add(T listener) {
listeners.add(listener);
}
public void dispatch() {
for (T listener : listeners) {
try {
Method method = listener.getClass().getMethod(methodName);
method.invoke(listener);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
}
モデル:
package model;
public class Model {
private EventDispatcher<ModelChangedHandler> dispatcher;
public Model() {
dispatcher = new EventDispatcher<ModelChangedHandler>("modelChanged");
}
public void whenModelChange(ModelChangedHandler handler) {
dispatcher.add(handler);
}
public void change() {
dispatcher.dispatch();
}
}
ModelChangedHandler:
package model;
public interface ModelChangedHandler {
void modelChanged();
}
プレゼンター:
package presenter;
public class Presenter {
private final Model model;
public Presenter(Model model) {
this.model = model;
this.model.whenModelChange(new ModelChangedHandler() {
@Override
public void modelChanged() {
System.out.println("model changed");
}
});
}
}
主要:
package main;
public class Main {
public static void main(String[] args) {
Model model = new Model();
Presenter presenter = new Presenter(model);
model.change();
}
}
今、私は「モデルが変更されました」というメッセージを受け取ることを期待しています。ただし、java.lang.IllegalAccessExceptionが発生します。クラスutils.EventDispatcherは、修飾子「public」を使用してクラスpresenter.Presenter$1のメンバーにアクセスできません。
責任のあるクラスは、プレゼンター内で作成した匿名のクラスであることを理解していますが、現在よりも「公開」する方法がわかりません。名前付きのネストされたクラスに置き換えると、機能するようです。PresenterとEventDispatcherが同じパッケージに含まれている場合にも機能しますが、それを許可することはできません(異なるパッケージの複数のプレゼンターがEventDispatcherを使用する必要があります)
何か案は?