Ich habe eine Klasse:Ist es eine schlechte Idee, den generischen Typ mit "this.getClass(). GetMethod()" zu überprüfen?
public class EventListener<T extends Event> {
private final EventHandler<T> handler;
public EventListener(EventHandler<T> handler) {
if (handler == null) {
throw new NullPointerException();
}
this.handler = handler;
}
public boolean isApplicable(Event event) {
try {
this.getClass().getMethod("onEvent", event.getClass());
return true;
} catch (NoSuchMethodException | SecurityException ex) {
return false;
}
}
public void onEvent(T event) {
handler.handle(event);
}
}
Vor einem Aufruf des onEvent (T Ereignis) Methode, die ich muss zu überprüfen, die isApplicable (Event-Ereignis) Methode aufrufen, dass der Hörer dieses Ereignis umgehen konnte.
Ich will nicht eine Reihe der Konstrukteurs-Parameter in einer solchen Art und Weise erhöhen:
public class GenericClass<T> {
private final Class<T> type;
public GenericClass(Class<T> type) {
this.type = type;
}
public Class<T> getMyType() {
return this.type;
}
}
Zuhörer für verschiedene Veranstaltungen werden in der gleichen Liste gespeichert werden. Also brauche ich ein Tool, um zu überprüfen, ob der Listener das Ereignis aus der Liste verarbeiten kann.
public class EventService extends Service {
private final ArrayList<EventListener> listeners = new ArrayList<>();
public EventService(ServiceContainer serviceContainer) {
super(serviceContainer);
}
public ArrayList<EventListener> getListeners() {
return listeners;
}
public <T extends Event> void trigger(T event) {
listeners.stream().forEach((listener) -> {
if (listener.isApplicable(event)) {
listener.onEvent(event);
}
});
}
}
Gibt es eine elegantere Code in dieser Methode zu setzen:
public boolean isApplicable(Event event) {
try {
this.getClass().getMethod("onEvent", event.getClass());
return true;
} catch (NoSuchMethodException | SecurityException ex) {
return false;
}
}
Make-Ereignis eine Schnittstelle, erklären die onEvent Methode oder es abstrakt machen und onEvent definieren. Auf diese Weise ist es nicht notwendig, nach "issApplicable" zu suchen oder eine neue Schnittstelle zu erstellen und onEvent dort zu deklarieren. Alle Zuhörer sollten diese neue Schnittstelle implementieren. – Jaiprakash
Was genau ist Ihr Problem? Der von Ihnen gepostete Code schlägt für alle abgeleiteten Klassen von 'Event' fehl, es sei denn, es wurde eine geeignete 'onEvent() '- Methodenüberladung für diese abgeleitete Klasse bereitgestellt. Ist das die Absicht? – EJP
Ich machte einige Klarstellungen in der Frage. Danke für die Antwort. Das Ergebnis wurde als Antwort mit "Endlich:" hinzugefügt. –