Java-Best Practice: Gießen von Objekten im Vergleich zu Interfaces

7

Angenommen, wir haben die folgenden Spielzeugschnittstellen:

%Vor%

und wir haben eine Klasse, die beide Schnittstellen implementiert:

%Vor%

An dieser Stelle sehe ich verschiedene Möglichkeiten, Methoden auf Duck aufzurufen, und ich kann mich nicht entscheiden, welches die beste Vorgehensweise ist. Betrachten Sie dieses Szenario:

%Vor%

Dieses Programm wird sich wie erwartet verhalten, da das an die Funktion übergebene Objekt zufällig in Flyer und Speakable umgewandelt werden kann, aber ich schaue mich zusammen, wenn ich Code wie diesen sehe, weil er keine Überprüfung der Kompilierzeit erlaubt aufgrund der engen Kopplung kann es unerwartete Ausnahmen auslösen, wenn beispielsweise ein anders typisiertes Objekt (das nicht auf eine oder beide der Schnittstellen umsetzbar ist) als Parameter übergeben wird oder wenn die Implementierung von Duck die Zeile nach unten ändert, sodass% nicht mehr implementiert wird co_de%.

Ich sehe Java-Code die ganze Zeit geschrieben, manchmal in Lehrbüchern (zum Beispiel S. 300 von "Head First Design Patterns" von O'Reilly), also muss es einen Verdienst geben, den ich vermisse.

Wenn ich ähnlichen Code schreiben würde, würde ich versuchen, Downcasting auf einen Typ oder eine Schnittstelle zu vermeiden, der nicht garantiert ist. Zum Beispiel würde ich in diesem Szenario so etwas tun:

%Vor%

Was würde ich tun können:

%Vor%

Ist das ein unnötiger Overkill? Was sind die Fallstricke dafür?

Ich glaube, dieses Design entkoppelt die Funktion Flyer von seinen Parametern und hält böse Fehler aufgrund der Überprüfung der Kompilierzeit in Schach.

Warum wird die erste Methode in der Praxis so häufig verwendet und die letzte nicht?

    
ForeverStudent 22.03.2016, 15:39
quelle

2 Antworten

11
  

Ich sehe Java-Code die ganze Zeit geschrieben, manchmal in Lehrbüchern (zum Beispiel S. 300 von "Head First Design Patterns" von O'Reilly), also muss es einen Verdienst geben, den ich vermisse.

Dieses Buch wurde ursprünglich 2004 veröffentlicht und ich glaube nicht, dass Java zu dieser Zeit Generics unterstützte. So war das unsichere Casting damals sehr üblich. Wahrscheinlich würde ich, wenn ich nicht die Unterstützung von parametrischem Polymorphismus in Java hätte, zuerst prüfen, ob der Parameter eine Instanz des Typs ist, in den ich ihn umsetzen möchte, und dann die eigentliche Umwandlung durchführen:

%Vor%

Mit Generics können wir dies jedoch tun:

%Vor%

Hier kann der Compiler sicherstellen, dass wir nicht etwas weiterleiten, das Speakable und Flyer nicht implementiert und solche frechen Versuche zur Kompilierzeit erkennen kann.

  

Warum wird die erste Methode in der Praxis so häufig verwendet und die letzte nicht?

Es könnte sein, dass Sie eine Menge Legacy-Code gesehen haben, nehme ich an. :)

    
Konstantin Yovkov 22.03.2016, 15:51
quelle
7

Sie können das Argument gleichzeitig als Speakable und Flyer erzwingen, indem Sie eine generische Methode mit dem Typ intersection erstellen:

%Vor%

Sie brauchen also kein Casting oder erstellen eine zusätzliche Schnittstelle.

    
Alex Salauyou 22.03.2016 15:50
quelle