2016-06-10 3 views
0

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.

+0

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

Antwort

1

... löst IOException, IOException {....

Redundanz ist nur verwirrend, aber läuft gut.

Ein gängiges Beispiel für Redundanz ist so etwas wie

throws StreamCorruptedException, IOException { 

In diesem Fall StreamCorruptedException ein IOException ist so ist es nicht erforderlich, kann aber enthalten sein, um es mit dem Javadoc konsistent zu machen, die mehr Details geben könnten für diese Ausnahme.

+0

Ich bin mir bewusst, dass das Werfen der Unterklasse einer anderen Ausnahme in Ordnung ist, ich frage mich nur, ob es irgendwelche Probleme gibt, die genau dieselbe Ausnahme zweimal haben, z. ... löst IOException, IOException {.... Normalerweise würden Sie dies nicht tun, aber in diesem Fall passiert es, wenn T und V dieselbe Ausnahme als Parameter haben. Vielleicht mache ich mir zu viele Gedanken :) –

+0

@ BjarneBoström Ich habe meine Antwort aktualisiert, um sie klarer zu machen. –