If you want to have one Handler class with multiple Methods:
You can simply use a huge if-else or use Reflection
if-else:
public void handle(Event event){
if(event instanceOf(EventA)){
handleEventA();
}
else if(event instanceOf(EventB)){
handleEventA();
}
//...
else{
handleDefaultEvent();
}
}
Reflection:
package com.stackoverflow.q56754275.single_class;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class HandlerController {
private Handler handler;
public HandlerController(Handler handler) {
this.handler=handler;
}
@SuppressWarnings("unchecked")
public void handle(Event event) {
Class<? extends Event> eventClass=event.getClass();
Class<?> handlerClass=handler.getClass();
Method handlerMethod=null;
while(eventClass!=null&&!eventClass.equals(Object.class)) {
try {
handlerMethod = handlerClass.getMethod("handle", eventClass);
handlerMethod.invoke(handler, event);
break;
} catch (NoSuchMethodException | IllegalArgumentException | IllegalAccessException | InvocationTargetException e) {
}
Class<?> superCl=eventClass.getSuperclass();
if (superCl!=null) {
eventClass=(Class<? extends Event>) superCl;
}
}
}
}
package com.stackoverflow.q56754275.single_class;
public interface Handler {
void handle(Event event);
}
package com.stackoverflow.q56754275.single_class;
public class Event {
}
package com.stackoverflow.q56754275.single_class;
public class SampleEventHandler implements Handler{
@Override
public void handle(Event event) {//default Handler
}
public void handle(EventA event) {//Handler for EventA
}
private static class EventA extends Event{
}
}
If you want hava a class for each handler:
You can create a Map<Class<? extends Event>,Handler> in order to find the Handlers of Events.
package com.stackoverflow.q56754275.multiple_classes;
import java.util.HashMap;
import java.util.Map;
public class EventController {
private Map<Class<? extends Event>, Handler> handlers=new HashMap<>();
@SuppressWarnings("unchecked")
public void handle(Event event) {
Class<? extends Event> cl=event.getClass();
while(cl!=null&&!handlers.containsKey(cl)) {
Class<?> superCl=cl.getSuperclass();
if (superCl==null||superCl.equals(Object.class)) {
cl=null;
}
else {
cl=(Class<? extends Event>) superCl;
}
}
if (cl != null) {
handlers.get(cl).handle(event);
}
}
public void addHandler(Class<? extends Event> eventToHandle, Handler handler) {
handlers.put(eventToHandle, handler);
}
package com.stackoverflow.q56754275.multiple_classes;
public class Event {
}
package com.stackoverflow.q56754275.multiple_classes;
public interface Handler {
void handle(Event event);
}
How to create a Handler?
package com.stackoverflow.q56754275.multiple_classes;
public class SampleEventHandler implements Handler{
@Override
public void handle(Event event) {
SampleEvent se=(SampleEvent) event;//if this is only for Events of type SampleEvent
System.out.println(se);
}
}
How to create an Event?
package com.stackoverflow.q56754275.multiple_classes;
public class SampleEvent extends Event {
@Override
public String toString() {
return "SampleEvent";
}
}
How to add a handler to the Controller(e.g. SampleEventHandler for SampleEvents ?
controller.addHandler(SampleEvent.class, new SampleEventHandler());
[NOTE]
It is possible to execute multiple handlers if you use Collections for handlers and iterate through them.
java.lang.reflect.Methodaccordingthe type using Reflection and invoke theMethodwith the event.