[JAVA] Punkt 64: Verweisen Sie auf Objekte anhand ihrer Schnittstellen

64. Siehe Schnittstelle

Es ist flexibler, den Typ in der Schnittstelle zu deklarieren.

** Alle Argumente, Rückgabewerte, Variablen und Felder sollten gegebenenfalls mit dem Schnittstellentyp deklariert werden. ** ** ** Auf die Objektklasse wird nur im Konstruktor verwiesen.

Im Folgenden nehmen wir als Beispiel LinkedHashSet, eine Implementierungsklasse der Set-Schnittstelle.

// Good - uses interface as type
Set<Son> sonSet = new LinkedHashSet<>();

Das Obige ist ein gutes Beispiel.

// Bad - uses class as type!
LinkedHashSet<Son> sonSet = new LinkedHashSet<>();

Das Obige ist ein schlechtes Beispiel.

In dem in der Schnittstelle deklarierten Beispiel kann die Implementierungsklasse grundsätzlich fehlerfrei geändert werden, indem einfach wie folgt geändert wird (da nur die in der Schnittstelle deklarierte Methode verwendet wird).

Set<Son> sonSet = new HashSet<>();

Beachten Sie jedoch, dass Code, der von Funktionen abhängt, die nicht in der Schnittstelle angegeben sind, die Implementierungsklasse ändern kann. Wenn Sie beispielsweise von der Neuordnungsrichtlinie für LinkedHashSet abhängig waren, hat die Änderung der Implementierung in HashSet Auswirkungen.

Wenn es keine geeignete Schnittstelle gibt

Wenn es keine richtige Schnittstelle gibt, ist es korrekt, nach Klassentyp zu deklarieren.

value class Stellen Sie sich beispielsweise eine Wertklasse vor, die einen Wert wie String oder BigInteger darstellt. Es ist unwahrscheinlich, dass die Wertklasse mehrere Implementierungen aufweist. Außerdem handelt es sich im Allgemeinen um eine Abschlussklasse, und es gibt keine entsprechende Schnittstelle. Die Werteklasse ist ein guter Typ für Argumente, Variablen, Felder und Rückgabewerte.

Bei Verwendung eines klassenbasierten Frameworks

Sie verwenden ein klassenbasiertes Framework, und manchmal ist der entsprechende zugrunde liegende Typ eher eine Klasse als eine Schnittstelle. Selbst in einem solchen Fall ist es besser, eine geeignete Klasse zu erben (im Allgemeinen abstrakt). OutputStream von java.io entspricht dem.

Es gibt keine geeignete Schnittstelle, aber eine für die Implementierungsklasse geeignete Methode ist implementiert

Beispielsweise verfügt PriorityQueue über eine Vergleichsmethode, die Warteschlangenschnittstelle jedoch nicht. Wenn Sie ein Programm schreiben, das von der Vergleichsmethode abhängt, lesen Sie PriorityQueue. Solche Fälle sind jedoch selten.

Die obigen drei Fälle sind nicht erschöpfend und vermitteln irgendwie die Szenen, auf die in der Klasse verwiesen wird.

** Wenn Sie keine geeignete Schnittstelle haben, sollten Sie sich auf die abstrakteste Klasse mit der gewünschten Funktionalität beziehen. ** ** **

Recommended Posts

Punkt 64: Verweisen Sie auf Objekte anhand ihrer Schnittstellen
Punkt 65: Schnittstellen der Reflexion vorziehen
Punkt 41: Verwenden Sie Markierungsschnittstellen, um Typen zu definieren