オーバーロードされたメソッドを持つ単一のEventHandler
クラスが必要で、イベントの種類にサブクラスがない場合は、リフレクションを使用する次の単純なコードが機能するはずです。
public class EventHandler {
public void handle (final PlayerMove move) {
//... handle
}
public void handle (final Contact contact) {
//... handle
}
public void handle (final Attack attack) {
//... handle
}
}
public void sendEvent (final EventHandler handler, final Object event) {
final Method method = EventHandler.class.getDeclaredMethod ("handle", new Class[] {event.getClass ()});
method.invoke (handler, event);
}
ただし、EventHandler
イベントごとに別々の を使用したい場合は、次の方法が適しています。
public interface EventHandler<T extends Event> {
void handle (T event);
}
public class PlayerMoveEventHandler implements EventHandler<PlayerMove> {
@Override
public void handle (final PlayerMove event) {
//... handle
}
}
public class EventRouter {
private final Map<Class, EventHandler> eventHandlerMap = new HashMap<Class, EventHandler> ();
public void sendEvent (final Event event) {
eventHandlerMap.get (event.getClass ()).handle (event);
}
public void registerHandler (final Class eventClass, final EventHandler handler) {
eventHandlerMap.put (eventClass, handler);
}
}