instanceof oder was anderes?

darkeye2

Bekanntes Mitglied
Hallo,

ich habe eine abstrace klasse Events diese wird von vielen anderen kalassen impimentiert z.b.:
NativeObserveEvent, FtpExceptionEvent, ...

nun möchte ich in einer anderen kalsse eine arraylist haben in der ich alle events speichen kann, sollte ja eigentlich so funktionieren :
ArrayList<Events> quee = new ArrayList<Events>();

wie kann icht nun aber überprüfen ob ein Event, aus dieser liste jetzt ein NativeObserveEvent oder sonst ein Event ist?

(Bitte verbessern, wenn ich bereits jetzt nen Denkfehler drin habe.)
 
Eigentlich nur mit instanceof (von solchen Sachen wie einer Methode "getType", die ein Enum zurückliefert oder so mal abgesehen). Die spannende Frage: An welchen Stellen musst du (warum) den Event-Typ kennen?
 
Nur das Programm, das auch auf dieses spezielle Event wartet muss die konkrete implementierung kennen.

Der queue sollte es gänzlich egal sein. Wenn du dabei bist ewige lange instanceof if-elese konstrukte zu bauen, dann machst du was falsch.
 
nein, es geht nicht um eine lange liste, es geht nur darum, wenn ich aus der warteschlange das nächste event von einem bestimmten typ haben will, irgendwie krieg ich das mit instanceof net hin, ich kriege als parameter immer den String, der den richtigen klassennamen angibt (z.b. NativeObserverEvent) wie kann ich nun abfragen, ob eine event jetzt ein NativeObserverEvent ist?
 
Java:
ArrayList<Events> queue = new ArrayList<Events>();
...
Events e = queue.get(0);
if (e instanceof NativeObserveEvent)
{
    NativeObserveEvent n = (NativeObserveEvent)e;
    ...
}

Manchmal kommt man nur schwer um ein instanceof drumrum, aber nochmal: Wozu brauchst du das?
 
So funktioniert das EventDispatching nicht..

Es gibt einen sender und einen empfänger.

Wenn du nun alles erst zusammenführst in eine queue und dann die emfänger anhand des typs bestimmst, dann ist das nicht korrekt.

Der sender sollte direkt an dem empfänger schicken.
 
ich unterstreiche das wozu nochmal ;-)

von der grundlage die Marcinek schon angesprochen hat... wenn du unbedingt (?!) untersch. Events wissen musst dann wäre es falsch sie in einer Liste zusammenzuschustern nur um dann sie wieder auseinander zu bekommen.... also wenn es wirklich so ist dass du untersch. Events wissen musst, dann auch mehrere Liste.

aber wie schon gesagt... kommentare oben
 
also ich habe ein methode die in der klasse Events drin ist und somit in allen klassen, die events impimentieren, alle ankommenden events kommen die die queue und werden von dort von einer klasse namens EventProzessor der reihe nach entnommen und die methode getReason und getParameter wird aufgerufen (ist in jeden Event drin) doch manchmal (selten aber kommt vor) muss unbedingt geschaut werden ob ein bestimmtes event in der warteschlange ist und dieses muss dann entnommen und bearbeitet werden.
 
1. Wenn ich in der Qualität deine Fragen beantworten würde, dann würdest du dich beschweren.

2. Nachdem ich nun mehrfach das versucht habe zu verstehen, was da steht. Denke ich immernoch, dass die implementierung mit so einem Zentralen Eventmanagement nicht die beste Lösung ist.

Ansonsten kannst du mit instanceof oprüfen, oder du implementierst eine Methode getType().
 
Naja, ein Zentrales Eventmanagement gibt es ja schon oft. Auch Swing hat "nur eine" EventQueue. Wenn ich das richtig sehe, gibt es da jetzt mehrere Möglichkeiten:
- instanceof (ich erwähne nur, dass es geht...)
- getType (auch das sei nur erwähnt)
- Ein Event-Interface/abstrakte Event-Basisklasse, die eine Methode "boolean mussRausgenommenWerden()" hat
- Prioritäten für Events (die wichtigen werden zuerst rausgeholt)
- Zwei Event-Queues, und die "Normale" wird nur abgearbeitet, wenn in der anderen keine Events liegen
...
Andere mögen die Liste nach belieben ergänzen 😉
 
Naja, ein Zentrales Eventmanagement gibt es ja schon oft. Auch Swing hat "nur eine" EventQueue. Wenn ich das richtig sehe, gibt es da jetzt mehrere Möglichkeiten:

Es hier aber alles die "gleichen" Events.

Nämlich die eines Users / Systems an den Swing Worker, damit iwas gemacht wird.

In dem Fall des TOs werden alle möglichen Events gesammelt.. Und sollen dann evaluiert werden. :bahnhof:
 
Also zur erklärung, das es scheinbar immer noch net ganz klar ist, was ich da mache:
In meinen Programm gibt es 2 arten von Ereignissen, die einen sind standartzeug, was eben so anfällt (klicks auf buttons, ...) und halt die ereignisse, die programmintern passieren. Die "internen" Ereignisse, müssen alle abgearbeitet werden, aber nicht unbedingt dann wenn sie auftreten und schon gar nicht von dem Thread, wo sie auftreten. Alle arbeitenden Threads (2-4 stück) müssen immer wieder an einen Thread Ereignisse übergeben, diese werden in der warteschlange gespeichert/ abgelegt. Wenn der EventHandler Thread nun normal arbeitet holt er ein Event nach dem anderen raus und ruft die 3 benötigten Methoden auf, diese sind immer gleich (zumindest vom namen her) und somit funktioniet dass auch ganz gut.

Nun kann es passierten dass einer der Arbeitenden Threads was ausführen will, was net geht, das ein vorher gesendetes Event noch nicht behandelt wurde. Es ist dem arbeitsThread ja bekannt, was für ein event das ist und es wird eine anfrage an den eventhandler gemacht. Dieser muss nun ein event diesen typs aus der liste holen und ausführen, das passiert nur selten aber es muss trotzdem möglich sein.

Prioritäten hab ich auch in der warteschlange ...

So ich hoffe es ist nun zumindest verständlich wozu ich das brauche, und die Events sind nicht "alle möglichen events" sonder sind sich alle irgendwo ähnlich und sollen deswegen auch in eine einzigste warteschlange.
 

Zurück
Oben