Как насчет использования другого метода в EventHandler:
public Event handleEvent(Event evt) {
if (evt instanceof SpecificEvent) {
return handleEvent((SpecificEvent)evt);
}
if (evt instanceof AnotherEvent) {
return handleEvent((AnotherEvent)evt);
}
// code for unknown type
}
Если у вас есть переменная типа Event, она будет вызвана и попытается вызвать один из других определенных методов. Если это Событие, расширяющее тип, для которого не определен метод, оно содержит код для этого случая. В классах, расширяющих EventHandler, будут вызваны перезаписанные методы.
Я знаю, что это не совсем красиво, но оно должно работать.
Edit:
Вы также можете попробовать сделать это рефлексивно:
public Event handleEvent(Event evt) throws InvocationTargetException{
try {
Method m = this.getClass().getMethod("handleEvent", evt.getClass());
return (Event) m.invoke(this, evt);
} catch (NoSuchMethodException nsme) {
nsme.printStackTrace();
} catch (IllegalAccessException iae) {
iae.printStackTrace();
} catch (InvocationTargetException ite) {
ite.getCause().printStackTrace();
throw ite;
}
// code for unknown type
}
Это будет работать лучше, если у вас много типов событий. Единственная проблема в том, что теперь вы должны позаботиться об исключениях. Я предполагаю, что если произойдет NoSuchMethodException
или IllegalAccessException
, вы можете их игнорировать, поскольку это означает, что для этого события не определен метод (или что он недоступен), поэтому вам необходимо вернуться к обработке по умолчанию неизвестных типов. Возможно, вы не захотите игнорировать InvocationTargetException
, поскольку это означает, что метод был вызван, но сам метод вызвал исключение, поэтому это означает, что существует проблема с кодом в методе.