Abstrakte Klasse versus Schnittstelle in der JDK 8-Ära

In der neuen Java 8-API für Datum und Uhrzeit: Ein Interview mit Stephen Colebourne erklärt Stephen Colebourne gegenüber Hartmut Schlosser: "Ich denke, die wichtigste Sprachänderung sind nicht Lambdas, sondern statische und Standardmethoden für Schnittstellen." Colebourne fügt hinzu: "Durch das Hinzufügen von Standardmethoden werden viele der Gründe für die Verwendung abstrakter Klassen beseitigt." Als ich dies las, stellte ich fest, dass Colebourne korrekt ist und dass viele Situationen, in denen ich derzeit abstrakte Klassen verwende, durch Schnittstellen mit JDK 8-Standardmethoden ersetzt werden könnten. Dies ist in der Java-Welt ziemlich bedeutsam, da der Unterschied zwischen abstrakten Klassen und Schnittstellen eines der Probleme war, die neue Java-Entwickler ärgern, die versuchen, den Unterschied zu verstehen. In vielerlei Hinsicht ist die Unterscheidung zwischen beiden in JDK 8 noch schwieriger.

Es gibt zahlreiche Beispiele für Online-Foren und -Blogs, in denen die Unterschiede zwischen Schnittstellen und abstrakten Klassen in Java erörtert werden. Dazu gehören, ohne darauf beschränkt zu sein, die abstrakten Klassen von JavaWorld im Vergleich zu Schnittstellen, StackOverflows Wann muss ich Schnittstellen anstelle von abstrakten Klassen verwenden?, Unterschied zwischen Schnittstelle und abstrakter Klasse sowie 10 Antworten auf Fragen zu abstrakten Klassen und Schnittstellen in Java. So nützlich und informativ diese auch waren, viele von ihnen sind jetzt veraltet und können für diejenigen, die neu in Java sind und ihre Java-Erfahrung mit JDK 8 beginnen, zu noch mehr Verwirrung führen.

Als ich über die verbleibenden Unterschiede zwischen Java-Schnittstellen und abstrakten Klassen in einer JDK 8-Welt nachdachte, beschloss ich zu sehen, was das Java-Tutorial dazu zu sagen hatte. Das Lernprogramm wurde aktualisiert, um JDK 8 widerzuspiegeln, und die abstrakten Methoden und Klassen enthalten einen Abschnitt mit dem Namen "Abstrakte Klassen im Vergleich zu Schnittstellen", der aktualisiert wurde, um JDK 8 zu integrieren. In diesem Abschnitt werden die Ähnlichkeiten und Unterschiede von JDK 8-Schnittstellen mit abstrakten Klassen hervorgehoben . Die hervorgehobenen Unterschiede sind die Zugänglichkeit von Datenelementen und Methoden: Abstrakte Klassen ermöglichen nicht statische und nicht endgültige Felder und ermöglichen es, dass Methoden öffentlich, privat oder geschützt sind, während die Felder der Schnittstellen von Natur aus öffentlich, statisch und endgültig sind Schnittstellenmethoden sind von Natur aus öffentlich.

Im Java-Lernprogramm werden Aufzählungszeichen aufgelistet, wann eine abstrakte Klasse berücksichtigt werden sollte und wann eine Schnittstelle berücksichtigt werden sollte. Es überrascht nicht, dass diese von den zuvor genannten Unterschieden abgeleitet sind und in erster Linie damit zu tun haben, ob Felder und Methoden privat, geschützt, nicht statisch oder nicht endgültig sein müssen (abstrakte Klasse bevorzugen) oder ob Sie sich auf das Tippen konzentrieren müssen ohne Rücksicht auf die Implementierung (favor interface).

Da Java es einer Klasse ermöglicht, mehrere Schnittstellen zu implementieren, aber nur eine Klasse zu erweitern, kann die Schnittstelle als vorteilhaft angesehen werden, wenn eine bestimmte Implementierung mehreren Typen zugeordnet werden muss. Dank der Standardmethoden des JDK 8 können diese Schnittstellen sogar Standardverhalten für Implementierungen bereitstellen.

Eine natürliche Frage könnte sein: "Wie geht Java mit einer Klasse um, die zwei Schnittstellen implementiert, die beide eine Standardmethode mit derselben Signatur beschreiben?" Die Antwort ist, dass dies ein Kompilierungsfehler ist. Dies wird im nächsten Screenshot gezeigt, in dem NetBeans 8 den Fehler meldet, als meine Klasse zwei Schnittstellen implementierte, die jeweils eine Standardmethode mit derselben Signatur ( String speak()) definierten.

Wie aus dem Screenshot hervorgeht, wird ein Compilerfehler angezeigt, der besagt, dass "Klasse ... nicht verwandte Standardeinstellungen für ... von Typen ... und ... erbt" (wobei der Klassenname, der Standardmethodenname und zwei Schnittstellennamen sind was auch immer in der Nachricht angegeben sind). Peter Verhas hat einen ausführlichen Beitrag ("Java 8-Standardmethoden: Was kann und was nicht?") Geschrieben, der sich mit einigen Eckfällen (Fallstricken) befasst, die sich auf mehrfach implementierte Schnittstellen mit Standardmethodennamen mit derselben Signatur beziehen.

Fazit

JDK 8 bringt wohl den größten Vorteil der abstrakten Klasse gegenüber der Schnittstelle zur Schnittstelle. Dies hat zur Folge, dass wahrscheinlich eine große Anzahl der heute verwendeten abstrakten Klassen ersetzt werden kann und eine große Anzahl zukünftiger Arbeiten, die abstrakte Klassen gewesen wären, nun stattdessen Schnittstellen zu Standardmethoden sind.

Diese Geschichte "Abstrakte Klasse versus Schnittstelle in der JDK 8-Ära" wurde ursprünglich von marxsoftware.blogspot.com veröffentlicht.