Fall vereinfacht: Legacy-Code. 3 Ausnahmen X, Y und ZException. Klasse A hat Methode public C fetch(...) throws X and YException
und Klasse B hat public C fetch(...) throws ZException
. Die Methodenimplementierung ist fast die gleiche, also habe ich mich gefragt, ob ich es in eine Hilfsklasse umwandeln könnte. Methodensignaturen können nicht geändert werden. Ich kam mit der folgenden HilfsklasseJava-Methodensignatur, die dieselbe Ausnahme (über Generika) zweimal wirft
public class Common<T extends Exception, V extends Exception>{
public static interface ExceptionSupplier<T extends Exception> {
public T create();
}
private ExceptionSupplier<T> es;
private ExceptionSupplier<V> es2;
public Common(ExceptionSupplier<T> es, ExceptionSupplier<V> es2) {
this.es = es;
this.es2 = es2;
}
public void method() throws T, V {
//example that would could throw both T and V
if (Math.random() < 0.5) {
throw es.create();
} else {
throw es2.create();
}
}
}
Dann kann ich Instanz dieser gemeinsamen Klasse in A und B z.
helper = new CommonThrower<ZException, ZException>(zSupplier, zSupplier);
helper = new CommonThrower<XException, YException>(xSupplier, ySupplier)
und helper.fetch(...)
nennen, und es zeigt (in Eclipse) throw richtigen Typen Beging. Es wird jedoch (wie erwartet) zweimal ZException werfen.
Meine Frage gibt es ein Problem mit einer Methode Unterschrift wirft SomeException, SomeException (d. H. Die gleiche Ausnahme wieder zu erklären)? Der Code wird kompiliert und läuft gut.
Generika sind nicht die Lösung. Mache eine private Methode für die gemeinsame Logik; Dann machen Sie separate öffentliche Methoden, die es aufrufen und alle Ausnahmen, die es in X/Y/ZExceptions wirft, umbrechen. – VGR