Seit Jahrzehnten ist es der Fall gewesen , dass Schnittstellen war nur nur (nur) für die Angabe Methodensignaturen. Uns wurde gesagt, dass dies der "richtige Weg ist, Dinge zu tun ™".
Dann kam Java 8 heraus und sagte:
Nun können Sie Standardmethoden definieren. Ich muss rennen, tschüss.
Ich bin gespannt, wie dies sowohl von erfahrenen Java-Entwicklern als auch von jenen, die vor kurzem (in den letzten Jahren) damit begonnen haben, verarbeitet wird. Ich frage mich auch, wie dies in die Java-Orthodoxie und -Praxis passt.
Ich erstelle experimentellen Code und während ich einige Umgestaltungen durchführte, erhielt ich eine Schnittstelle, die einfach eine Standardschnittstelle (Iterable) erweitert und zwei Standardmethoden hinzufügt. Und ich werde ehrlich sein, ich fühle mich ziemlich gut dabei.
Ich weiß, dass dies ein wenig offen ist, aber da es nun einige Zeit für Java 8 gab, um in realen Projekten verwendet zu werden, gibt es noch eine Orthodoxie zur Verwendung von Standardmethoden? Was ich meistens sehe, wenn sie besprochen werden, ist, wie man einer Schnittstelle neue Methoden hinzufügt, ohne vorhandene Verbraucher zu zerbrechen. Aber wie wäre es damit, dies von Anfang an wie in dem Beispiel zu verwenden, das ich oben angegeben habe? Hat jemand Probleme mit der Bereitstellung von Implementierungen in ihren Schnittstellen?
quelle
java.util.function.Function
zur Verwendung von Standardmethoden in einer brandneuen Benutzeroberfläche finden Sie unter.Antworten:
Ein großartiger Anwendungsfall sind die von mir als "Hebel" bezeichneten Schnittstellen: Schnittstellen, die nur über eine geringe Anzahl abstrakter Methoden verfügen (idealerweise 1), aber eine Menge "Hebel" bieten, indem sie Ihnen eine Menge Funktionalität bieten: Sie allein Müssen Sie 1 Methode in Ihrer Klasse implementieren, aber erhalten Sie viele andere Methoden "kostenlos". Denken Sie an einer Sammlung Schnittstelle, zum Beispiel mit einem einzigen abstrakten
foreach
Verfahren unddefault
Methoden wiemap
,fold
,reduce
,filter
,partition
,groupBy
,sort
,sortBy
, usw.Hier einige Beispiele. Beginnen wir mit
java.util.function.Function<T, R>
. Es gibt nur eine abstrakte MethodeR apply<T>
. Es gibt zwei Standardmethoden, mit denen Sie die Funktion mit einer anderen Funktion auf zwei verschiedene Arten zusammenstellen können, entweder vorher oder nachher. Beide dieser Kompositionsmethoden werden unter Verwendung von nur implementiertapply
:Sie können auch eine Schnittstelle für vergleichbare Objekte erstellen, etwa wie folgt:
Oder ein extrem vereinfachtes Auflistungsframework, in dem alle Auflistungsvorgänge
Collection
unabhängig vom ursprünglichen Typ zurückgegeben werden:Dies wird in Kombination mit Lambdas sehr interessant, da eine solche "Hebel" -Schnittstelle von einem Lambda implementiert werden kann (es ist eine SAM-Schnittstelle).
Dies ist der gleiche Anwendungsfall, für den Erweiterungsmethoden in C♯ hinzugefügt wurden, aber Standardmethoden haben einen eindeutigen Vorteil: Sie sind "richtige" Instanzmethoden, dh sie haben Zugriff auf private Implementierungsdetails der Schnittstelle (
private
Schnittstellenmethoden werden bereitgestellt) in Java 9), während Erweiterungsmethoden nur syntaktischer Zucker für statische Methoden sind.Sollte Java jemals Interface Injection bekommen, würde es auch typsicheres, modulares Affen-Patching ermöglichen. Dies wäre für Sprachimplementierer in der JVM sehr interessant: Im Moment übernimmt JRuby beispielsweise entweder Java-Klassen oder bricht sie um, um ihnen zusätzliche Ruby-Semantik bereitzustellen. Idealerweise möchten sie jedoch dieselben Klassen verwenden. Mit Injection - Schnittstelle und Standard Methods, könnten sie injizieren zB eine
RubyObject
Schnittstelle injava.lang.Object
, so dass ein JavaObject
und RubyObject
die ist genau die gleiche Sache .quelle
Comparable
Schnittstelle mit einer abstraktencompareTo
Methode und StandardlessThan
,lessThanOrEqual
,greaterThan
,greaterThanOrEqual
,isBetween
, undclamp
Methoden, die alle in Bezug auf die UmsetzungcompareTo
. Oder sehenjava.util.function.Function
Sie sich nur an : Es gibt eine abstrakteapply
Methode und zwei Standard-Kompositionsmethoden, die beide in Bezug auf implementiert sindapply
. Ich habe versucht, ein Beispiel für eineCollection
Schnittstelle zu nennen, aber es ist schwierig und zu lang, alles typsicher zu machen. Ich werde versuchen, einer nicht typsicheren, nicht typerhaltenden Version eine Chance zu geben. Bleib dran.