Zunächst einmal, für alle da draußen, die den instanceof
-Operator verabscheuen, verachten und verabscheuen, verstehe ich Ihre Bedenken damit, aber ich bin gezwungen, es zu verwenden. Das liegt daran, dass ich nicht die Autorität habe, die Art und Weise vollständig umzustrukturieren, wie ein anderes Entwicklungsteam ein Projekt aufgesetzt hat, also es sei denn, ich übersehe hier etwas, sehe ich einfach keinen Weg, es zu umgehen.
Ich habe ein Java POJO, das nicht geändert werden kann und es Ihnen ermöglicht, eine Exception
als eine seiner Eigenschaften festzulegen:
public class Message {
private Exception exception;
public void setException(Exception exc) {
this.exception = exc;
}
}
Nochmals, ich kann diese Message
-Klasse nicht ändern.
Ich schreibe eine Fehlerbehandlungsmethode, die eine Instanz von MessageContainer
übergeben bekommt, und ich benötige eine Logik, um verschiedene Dinge zu tun, abhängig davon, welcher Typ von Ausnahme auf der Message
des Containers eingestellt wurde:
public class ErrorHandler {
public void handle(MessageContainer container) {
Message msg = container.getMessage();
Exception exc = msg.getException();
if(exc instanceof FizzException)
System.out.println("Tu x");
else if(exc instanceof BuzzException)
System.out.println("Tu y");
else
System.out.println("Tu z");
}
}
Nochmals, ich kann die Tatsache nicht ändern, dass ErrorHandler#handle
eine Instanz von MessageContainer
übergeben bekommt und nicht eine injectable Message
-Instanz.
Also, auch wenn ich instanceof
wirklich nicht mag, sehe ich keinen anderen Weg, um diese Logik zu erreichen (aber machen Sie gerne Vorschläge... solange sie keine Änderungen an Message
, MessageContainer
oder der Methode handle(MessageContainer)
beinhalten!).
Aber selbst wenn ich instanceof
verwende, wie funktioniert dieser Code überhaupt? Sobald Sie die Exception
aus der Message
herausziehen, glaube ich nicht, dass eines der instanceof
s ausgelöst wird, weil es als Exception
gecastet ist, ohne die Möglichkeit zu erkennen, ob es sich um BuzzException
, FizzException
usw. handelt. Was sind meine Möglichkeiten hier? Vielen Dank im Voraus.