Hallo zusammen,
mein erster Post in diesem Forum
Ich habe in der Vergangenheit bereits mit Basic, Pascal, Delphi (sehr lange her) und später mit C# programmiert. Da ich zuhause seit einiger Zeit ausschließlich unter Linux arbeite, wollte ich mich nun noch einmal mit einer Sprache beschäftigen, die auch hier gut unterstützt wird. Nach einem kurzen Schnupperausflug in C++ bin ich jetzt bei Java gelandet. Ist alles nur hobbymäßig, um der frühzeitigen Vergreisung entgegen zu wirken.
Aktuell versuche ich mir ein kleines Messagesystem zu schreiben, d.h. Objekte können sich registrieren und alle Objekte, die eine Methode "handle(Event e)" implementieren werden bei einem "dispatch(Event e)" benachrichtigt. Das hat auch schon ganz gut funktioniert, bis ich den festen Namen des Handlers flexibel gestalten wollte. Jetzt erhalte ich die oben genannte Ausnahme, wenn ich ein Objekt mit "unregister" wieder entfernen möchte.
Was mache ich dabei falsch?
Und ganz allgemein: Ist das alles einigermaßen in Ordnung, oder gibt es grobe Schnitzer?
Dankeschön,
temi
mein erster Post in diesem Forum
Ich habe in der Vergangenheit bereits mit Basic, Pascal, Delphi (sehr lange her) und später mit C# programmiert. Da ich zuhause seit einiger Zeit ausschließlich unter Linux arbeite, wollte ich mich nun noch einmal mit einer Sprache beschäftigen, die auch hier gut unterstützt wird. Nach einem kurzen Schnupperausflug in C++ bin ich jetzt bei Java gelandet. Ist alles nur hobbymäßig, um der frühzeitigen Vergreisung entgegen zu wirken.
Aktuell versuche ich mir ein kleines Messagesystem zu schreiben, d.h. Objekte können sich registrieren und alle Objekte, die eine Methode "handle(Event e)" implementieren werden bei einem "dispatch(Event e)" benachrichtigt. Das hat auch schon ganz gut funktioniert, bis ich den festen Namen des Handlers flexibel gestalten wollte. Jetzt erhalte ich die oben genannte Ausnahme, wenn ich ein Objekt mit "unregister" wieder entfernen möchte.
Was mache ich dabei falsch?
Und ganz allgemein: Ist das alles einigermaßen in Ordnung, oder gibt es grobe Schnitzer?
Dankeschön,
temi
Code:
import java.util.List;
import java.util.ArrayList;
public class EventAggregator
{
private class Handler
{
private final Object handler;
private final String method;
public Handler(Object handler, String method)
{
this.handler = handler;
this.method = method;
}
public Object getHandler()
{
return handler;
}
public String getMethod()
{
return method;
}
}
private List<Handler> handlers = new ArrayList<>();
public void register(Object handler)
{
this.register(handler, "handle");
}
public void register(Object handler, String method)
{
handlers.add(new Handler(handler, method));
}
public void unregister(Object handler)
{
for(Handler h : handlers)
{
if (h.getHandler() == handler)
{
handlers.remove(h); // Hier Exception!
}
}
}
public void dispatch(Event event)
{
for(Handler h : handlers)
{
Object handler = h.getHandler();
String method = h.getMethod();
try
{
handler.getClass()
.getDeclaredMethod(method, new Class[]{event.getClass()})
.invoke(handler, event);
}
catch(Exception e) { }
}
}
}