** 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 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.
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.
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. ** ** **