Hi,
ich hänge gerade bei der Struktur für ein Projekt.
Das Problem ist, ich habe einen Aufbau mit vielen verschiedenen Klassen,
die sich an bestimmte Trigger-Events hängen können (wie gewöhnliche listener).
Jedoch soll es auch möglich sein, wenn manche Trigger ziehen, "unterbrochene" Methoden
von außen zu unterbrechen.
Hier mal ein kleines Beispiel:
Klasse 1: Hans
Klasse 2: Peter
Hans führt Methode laufen aus:
Dabei soll jetzt hans.stopAction() die aktuelle Methode in der hans "steht" (weil er durch den trigger unterbrochen wurde) beenden, dh. hans ist fertig mit laufen und das programm läuft normal weiter.
Nur jetzt ist mir nicht klar wie man sowas umsetzen soll,
eine Lösung die geht aber ziemlich doof aussieht (besonders bei vielen aufrufen mit triggermöglichkeit in einer methode) wäre mit nem return:
Das kann ja auf keinen Fall eine gute Lösung sein!
Vielleicht kann man das auch geschickt mit Exceptions lösen,
damit hätte man wenigstens nur eine "abfrage":
Dann muss natürlich jedes Trigger-Interface die StopActionException thrown können,
und anstatt hans.stopAction() muss der peter dann throw new StopActionException() aufrufen um den hans zu stoppen.
Übersehe ich hier was komplett, oder was habt ihr noch für Ideen?
Edit: Das Problem bei den exception ist, die sind anonym. ich kann damit immer nur den letzten ausführer stoppen, und nicht hans.stop() sagen. später kann es halt sein, dass nicht genau zu sagen ist wer die trigger methode aktiviert hat, und dann durch die exception "gekiillt" wird. ich brauche eher sowas, mit dem ich ein objekt tatsächlich "stop" sagen kann, und das bewirkt, falles es gerade irgendwo in einer methode ist, das diese nicht mehr weiter ausgeführt wird, sondern zum ende springt.
ich hänge gerade bei der Struktur für ein Projekt.
Das Problem ist, ich habe einen Aufbau mit vielen verschiedenen Klassen,
die sich an bestimmte Trigger-Events hängen können (wie gewöhnliche listener).
Jedoch soll es auch möglich sein, wenn manche Trigger ziehen, "unterbrochene" Methoden
von außen zu unterbrechen.
Hier mal ein kleines Beispiel:
Klasse 1: Hans
Klasse 2: Peter
Hans führt Methode laufen aus:
Java:
...
laufen (){
//jetzt passiert was
irgendwas.machwas(); // <= diese aktion kann irgendwo in anderen klassen trigger auslösen
// und jetzt noch viel mehr....
...
...
}
Dabei führt der Aufruf irgendwas.machwas() dazu, dass in Peter ein Listener anspringt.
Dieser könnte so aussehen:
...
wasPassiert(WerIstSchuld hans)
{
// jetzt bin ich peter erst mal dran
...
//der hans hat nix mehr zusagen
hans.stopAction();
}
Dabei soll jetzt hans.stopAction() die aktuelle Methode in der hans "steht" (weil er durch den trigger unterbrochen wurde) beenden, dh. hans ist fertig mit laufen und das programm läuft normal weiter.
Nur jetzt ist mir nicht klar wie man sowas umsetzen soll,
eine Lösung die geht aber ziemlich doof aussieht (besonders bei vielen aufrufen mit triggermöglichkeit in einer methode) wäre mit nem return:
Java:
boolean stop=false;
stopAction()
{
stop=true;
}
laufen (){
irgendwas.machwas();
if(stop)
{
return;
}
...
...
//nach jedem methodenaufruf muss das wieder rein!
}
Das kann ja auf keinen Fall eine gute Lösung sein!
Vielleicht kann man das auch geschickt mit Exceptions lösen,
damit hätte man wenigstens nur eine "abfrage":
Java:
laufen(){
try{
irgendwas.machwas();
...
...
irgenwas.machNochmalWas();
...
...
} catch(StopActionException e){
// do nothing, your action was cancelled
}
}
und anstatt hans.stopAction() muss der peter dann throw new StopActionException() aufrufen um den hans zu stoppen.
Übersehe ich hier was komplett, oder was habt ihr noch für Ideen?
Edit: Das Problem bei den exception ist, die sind anonym. ich kann damit immer nur den letzten ausführer stoppen, und nicht hans.stop() sagen. später kann es halt sein, dass nicht genau zu sagen ist wer die trigger methode aktiviert hat, und dann durch die exception "gekiillt" wird. ich brauche eher sowas, mit dem ich ein objekt tatsächlich "stop" sagen kann, und das bewirkt, falles es gerade irgendwo in einer methode ist, das diese nicht mehr weiter ausgeführt wird, sondern zum ende springt.
Zuletzt bearbeitet: