Verwendungszweck: Standardmethode für die Java 8+ -Schnittstelle im Vergleich zur abstrakten Methode

540

Java 8 ermöglicht die Standardimplementierung von Methoden in Schnittstellen, die als Standardmethoden bezeichnet werden .

Ich bin verwirrt darüber, wann ich diese Art von interface default methodanstelle von abstract class(mit abstract method(s)) verwenden würde.

Wann sollte eine Schnittstelle mit Standardmethoden verwendet werden und wann sollte eine abstrakte Klasse (mit abstrakten Methoden) verwendet werden? Sind die abstrakten Klassen in diesem Szenario noch nützlich?

Narendra Pathai
quelle
38
Vielleicht können Sie noch keine Felder, privaten Methoden usw. in Schnittstellen haben, während Sie in abstrakten Klassen können?
sp00m
2
Ich habe mich schon früher über dieses Thema gewundert, jetzt bin ich klar. Danke an @Narendra Pathai. Ich möchte einen Link zu einem anderen Thread hinzufügen, den Sie zu demselben Thema gefragt haben, da beide meine Zweifel waren. stackoverflow.com/questions/19998309/…
Ashutosh Ranjan
Sie finden einen schönen Beitrag zu diesem hier: blog.codefx.org/java/everything-about-default-methods
Fabri Pautasso
Manchmal können Sie eine Basisklasse immer noch als Schnittstelle codieren, selbst wenn die Basisklasse den Status hat. Es ist nur so, dass die Schnittstelle Setter und Getter für den Status definieren muss und die konkreten Klassen sie implementieren und das Feld definieren müssen. Eine Einschränkung besteht darin, dass in einer abstrakten Klasse die Bean-Eigenschaft privat oder geschützt sein kann. In Schnittstellen haben nur öffentliche Methoden. Ein Grund, warum Sie eine abstrakte Basisklasse verwenden würden, besteht darin, dass Ihre Klassen eine Eigenschaft haben, die privat oder geschützt sein muss.
DaBlick
@DaBlick Konnten Sie das Statusproblem in einer Schnittstelle nicht über eine HashMap lösen. Beispiel: Wenn Sie eine Klasse Foo möchten, die int a, b, String c enthält. Wenn Sie möchten, dass sie den Status haben, erstellen Sie eine HashMap </ * Name des Foo-Objekts * / String, / * Karte der Felder * / Hashmap </ * Name spezifisches Feld * / String, / * Feldwert * / Objekt >> Karte . Wenn Sie die theoretische Klasse Foo "instanziieren" möchten, haben Sie die Methode "instanziieren" (String nameOfFoo), die map.put (nameOfFoo, Felder) ausführt, wobei fields eine HashMap <String, Object> fields.put ("a", new) ist int ("5")); fields.put ("b", new int ("6")); fields.put ("c", "blah"));
George Xavier

Antworten:

307

Abstrakte Klassen bieten viel mehr als Standardmethodenimplementierungen (z. B. privater Status). Ab Java 8 sollten Sie jedoch immer dann, wenn Sie die Wahl haben, die Defender- defaultMethode (auch bekannt als. ) In der Benutzeroberfläche verwenden.

Die Einschränkung für die Standardmethode besteht darin, dass sie nur in Form von Aufrufen anderer Schnittstellenmethoden implementiert werden kann, ohne dass auf den Status einer bestimmten Implementierung Bezug genommen wird. Der Hauptanwendungsfall sind also übergeordnete und bequeme Methoden.

Das Gute an dieser neuen Funktion ist, dass Sie, bevor Sie zuvor gezwungen waren, eine abstrakte Klasse für die Convenience-Methoden zu verwenden, wodurch der Implementierer auf eine einzelne Vererbung beschränkt wurde, jetzt ein wirklich sauberes Design mit nur der Schnittstelle und einem Minimum an Implementierung haben können Anstrengung dem Programmierer aufgezwungen.

Die ursprüngliche Motivation, defaultMethoden in Java 8 einzuführen , war der Wunsch, die Collections Framework-Schnittstellen mit Lambda-orientierten Methoden zu erweitern, ohne vorhandene Implementierungen zu beschädigen. Obwohl dies für die Autoren öffentlicher Bibliotheken relevanter ist, finden Sie dieselbe Funktion möglicherweise auch in Ihrem Projekt nützlich. Sie haben einen zentralen Ort, an dem Sie neuen Komfort hinzufügen können, und Sie müssen sich nicht darauf verlassen, wie der Rest der Typhierarchie aussieht.

Marko Topolnik
quelle
34
Aus diesem Grund würden sie als nächstes Standardmethodendeklarationen hinzufügen. Ich bin mir immer noch nicht sicher, die Funktion scheint mir eher ein Hack zu sein, der jedem wegen Missbrauchs ausgesetzt ist.
Panther
3
Die einzige Verwendung von abstrakten Klassen in der Java 8-Ära, die ich sehen kann, ist das Definieren nicht endgültiger Felder. In Schnittstellen sind die Felder standardmäßig endgültig, sodass Sie sie nach ihrer Zuweisung nicht mehr ändern können.
Anuroop
7
@ Anuroop Nicht nur standardmäßig --- das ist die einzige Option. Schnittstellen können den Instanzstatus nicht deklarieren, weshalb abstrakte Klassen hier bleiben sollen.
Marko Topolnik
2
@PhilipRego Abstrakte Methoden rufen nichts auf, da sie keine Implementierung haben. Die in einer Klasse implementierten Methoden können auf den Status der Klasse zugreifen (Instanzvariablen). Schnittstellen können sie nicht deklarieren, sodass die Standardmethoden nicht auf sie zugreifen können. Sie müssen sich darauf verlassen, dass die Klasse eine implementierte Methode bereitstellt, die auf den Status zugreift.
Marko Topolnik
2
Marko Topolnik, Ihre Antwort ist tot auf. Ich möchte jedoch ein Update Ihrer Antwort empfehlen. Möglicherweise möchten Sie hinzufügen, dass das Schöne an Standardmethoden darin besteht, dass Ihre vorherige Implementierung dieser Schnittstelle nicht unterbrochen wird, wenn die Schnittstelle neue Standardmethoden hinzufügt. Dies war nicht wahr vor Java 8.
hfontanez
125

Es gibt einige technische Unterschiede. Abstrakte Klassen können im Vergleich zu Java 8-Schnittstellen noch mehr:

  1. Abstrakte Klasse kann einen Konstruktor haben.
  2. Abstrakte Klassen sind strukturierter und können einen Zustand halten.

Konzeptionell besteht der Hauptzweck von Defender-Methoden in der Abwärtskompatibilität nach Einführung neuer Funktionen (als Lambda-Funktionen) in Java 8.

Vadym Vasyliev
quelle
20
Diese Antwort ist tatsächlich richtig und macht vor allem Sinn. "Konzeptionell ist der Hauptzweck der Verteidigermethoden eine Abwärtskompatibilität"
Versuch
1
@UnKnown diese Seite gibt mehr Einblick: docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html
Bernie
@UnKnown, im Grunde können Sie einer Schnittstelle Methoden hinzufügen, und Klassen, die diese Schnittstelle implementieren, erhalten diese Funktionalität automatisch.
LegendLength
3
Ein subtilerer Punkt über Punkt Nr. 2 oben über "Kann Zustand halten ist dies". Abstrakte Klassen können einen Status enthalten, der später geändert werden kann. Schnittstellen können auch den Status halten, aber sobald ein Status nach der Instanzerstellung zugewiesen wurde, kann der Status nicht mehr geändert werden.
Anuroop
3
@ Anuroop Ich würde die public static finalFelder einer Schnittstelle nicht als "Zustand" beschreiben. Der staticTeil bedeutet, dass sie überhaupt nicht auf eine bestimmte Instanz bezogen sind. Sie werden bei der Klasseninstanziierung zugewiesen , was nicht mit der nach der Instanzerstellung identisch ist .
Geronimo
65

Dies wird in diesem Artikel beschrieben . Denken Sie forEachan Sammlungen.

List<?> list = 
list.forEach(…);

Das forEach ist noch nicht von java.util.Listder java.util.CollectionSchnittstelle deklariert . Eine naheliegende Lösung wäre, einfach die neue Methode zur vorhandenen Schnittstelle hinzuzufügen und die Implementierung bereitzustellen, wo dies im JDK erforderlich ist. Nach der Veröffentlichung ist es jedoch unmöglich, einer Schnittstelle Methoden hinzuzufügen, ohne die vorhandene Implementierung zu beschädigen.

Der Vorteil von Standardmethoden besteht darin, dass jetzt eine neue Standardmethode zur Schnittstelle hinzugefügt werden kann, ohne dass die Implementierungen beschädigt werden.

Masudul
quelle
1
"Es ist unmöglich, einer Schnittstelle Methoden hinzuzufügen, ohne die vorhandene Implementierung zu beschädigen" - oder?
Andrey Chaschev
26
@AndreyChaschev Wenn Sie der Schnittstelle eine neue Methode hinzufügen, müssen alle Implementierer diese neue Methode implementieren. Daher werden vorhandene Implementierungen unterbrochen.
Marko Topolnik
4
@ MarkoTopolnik danke, habe das verpasst. Nur um zu erwähnen, dass es eine Möglichkeit gibt, dies teilweise zu vermeiden - indem diese Methode in einer abstrakten Standardimplementierung dargestellt wird. Für dieses Beispiel würde dies ein AbstractList::forEachwerfen UnsupportedOperationException.
Andrey Chaschev
3
@AndreyChaschev Ja, das war der alte Weg (khm ... ist der aktuelle Weg :), mit dem Mangel, dass es den Implementierer auf eine einzelne Vererbung von der bereitgestellten abstrakten Implementierung beschränkt.
Marko Topolnik
Ich werde nicht brechen, wenn es so kommt, dass alle Implementierungen diese Methode im Voraus enthalten. Welches ist unwahrscheinlich, aber möglich.
George Xavier
19

Diese beiden sind sehr unterschiedlich:

Standardmethoden sind das Hinzufügen externer Funktionen zu vorhandenen Klassen, ohne deren Status zu ändern.

Und abstrakte Klassen sind eine normale Art der Vererbung, sie sind normale Klassen, die erweitert werden sollen.

Andrey Chaschev
quelle
18

Wie in diesem Artikel beschrieben,

Abstrakte Klassen versus Schnittstellen in Java 8

Nach der Einführung der Standardmethode scheinen Schnittstellen und abstrakte Klassen identisch zu sein. In Java 8 sind sie jedoch immer noch ein anderes Konzept.

Abstrakte Klasse kann Konstruktor definieren. Sie sind strukturierter und können mit einem Status verknüpft sein. Im Gegensatz dazu kann die Standardmethode nur durch Aufrufen anderer Schnittstellenmethoden implementiert werden, ohne dass auf den Status einer bestimmten Implementierung Bezug genommen wird. Daher hängt die Verwendung für verschiedene Zwecke und die Wahl zwischen zwei wirklich vom Szenariokontext ab.

Sufiyan Ghori
quelle
Ich glaube, dass die abstrakte Klasse einen Konstruktor hat, der anders als in Interface definiert werden kann. In Java 8 unterscheiden sich beide auch aus diesem Grund.
Hemanth Peela
1
Warum hat eine abstrakte Klasse einen Konstruktor, wenn er nicht instanziiert werden kann?
George Xavier
Wir können super () aus der untergeordneten Klasse aufrufen, die den Konstruktor der abstrakten Klasse aufruft. Dies wirkt sich auf den Status der abstrakten Klasse aus.
Sujay Mohan
14

In Bezug auf Ihre Anfrage von

Wann sollte eine Schnittstelle mit Standardmethoden verwendet werden und wann sollte eine abstrakte Klasse verwendet werden? Sind die abstrakten Klassen in diesem Szenario noch nützlich?

Java- Dokumentation bietet perfekte Antwort.

Abstrakte Klassen im Vergleich zu Schnittstellen:

Abstrakte Klassen ähneln Schnittstellen. Sie können sie nicht instanziieren und sie können eine Mischung von Methoden enthalten, die mit oder ohne Implementierung deklariert wurden.

Mit abstrakten Klassen können Sie jedoch Felder deklarieren, die nicht statisch und endgültig sind, und öffentliche, geschützte und private konkrete Methoden definieren.

Bei Schnittstellen sind alle Felder automatisch öffentlich, statisch und endgültig, und alle Methoden, die Sie deklarieren oder definieren (als Standardmethoden), sind öffentlich. Darüber hinaus können Sie nur eine Klasse erweitern, unabhängig davon, ob sie abstrakt ist oder nicht, während Sie eine beliebige Anzahl von Schnittstellen implementieren können.

Anwendungsfälle für jeden von ihnen wurden im folgenden SE-Beitrag erläutert:

Was ist der Unterschied zwischen einer Schnittstelle und einer abstrakten Klasse?

Sind die abstrakten Klassen in diesem Szenario noch nützlich?

Ja. Sie sind immer noch nützlich. Sie können nicht statische, nicht endgültige Methoden und Attribute enthalten ( geschützt, privat zusätzlich zu öffentlich ), was selbst mit Java-8-Schnittstellen nicht möglich ist.

Ravindra Babu
quelle
Jetzt haben Schnittstellen auch private Methoden howtodoinjava.com/java9/java9-private-interface-methods
valijon
13

Wann immer wir die Wahl zwischen abstrakter Klasse und Schnittstelle haben, sollten wir immer (fast) Standardmethoden (auch als Defender- oder virtuelle Erweiterungen bezeichnet) bevorzugen.

  1. Standardmethoden haben das klassische Schnittstellenmuster und eine Begleitklasse beendet, die die meisten oder alle Methoden in dieser Schnittstelle implementiert. Ein Beispiel ist Collection and AbstractCollection. Jetzt sollten wir die Methoden in der Schnittstelle selbst implementieren, um die Standardfunktionalität bereitzustellen. Die Klassen, die die Schnittstelle implementieren, haben die Wahl, die Methoden zu überschreiben oder die Standardimplementierung zu erben.
  2. Eine weitere wichtige Verwendung von Standardmethoden ist interface evolution. Angenommen, ich hätte einen Klassenball als:

    public class Ball implements Collection { ... }

Jetzt wird in Java 8 eine neue Funktion eingeführt. Wir können einen Stream erhalten, indem wir eine streamMethode verwenden, die der Schnittstelle hinzugefügt wurde. Wenn dies streamkeine Standardmethode Collectionwäre, wären alle Implementierungen für die Schnittstelle fehlerhaft, da sie diese neue Methode nicht implementieren würden. Das Hinzufügen einer nicht standardmäßigen Methode zu einer Schnittstelle ist dies nicht source-compatible.

Angenommen, wir kompilieren die Klasse nicht neu und verwenden eine alte JAR-Datei, die diese Klasse enthält Ball. Die Klasse wird ohne diese fehlende Methode einwandfrei geladen, Instanzen können erstellt werden und anscheinend funktioniert alles einwandfrei. ABER wenn das Programm die streamMethode auf eine Instanz von aufruft , erhalten Ballwir AbstractMethodError. Die Standardeinstellung der Methode löste also beide Probleme.

akhil_mittal
quelle
9

Standardmethoden in der Java-Schnittstelle ermöglichen die Entwicklung der Schnittstelle .

Wenn Sie bei einer vorhandenen Schnittstelle eine Methode hinzufügen möchten, ohne die Binärkompatibilität mit älteren Versionen der Schnittstelle zu beeinträchtigen, stehen Ihnen zwei Optionen zur Verfügung: Hinzufügen einer Standardmethode oder einer statischen Methode. In der Tat müsste jede abstrakte Methode, die der Schnittstelle hinzugefügt wird, von den Klassen oder Schnittstellen implementiert werden, die diese Schnittstelle implementieren.

Eine statische Methode ist für eine Klasse eindeutig. Eine Standardmethode ist für eine Instanz der Klasse eindeutig.

Wenn Sie einer vorhandenen Schnittstelle eine Standardmethode hinzufügen, müssen Klassen und Schnittstellen, die diese Schnittstelle implementieren, diese nicht implementieren. Sie können

  • Implementieren Sie die Standardmethode und überschreiben Sie die Implementierung in der implementierten Schnittstelle.
  • Deklarieren Sie die Methode erneut (ohne Implementierung), wodurch sie abstrakt wird.
  • nichts tun (dann wird die Standardmethode von der implementierten Schnittstelle einfach vererbt).

Mehr zum Thema hier .

kiriloff
quelle
7

Obwohl es eine alte Frage ist, möchte ich auch meinen Beitrag dazu leisten.

  1. abstrakte Klasse: Innerhalb der abstrakten Klasse können wir Instanzvariablen deklarieren, die für die untergeordnete Klasse erforderlich sind

    Schnittstelle: Innerhalb der Schnittstelle sind alle Variablen immer öffentlich statisch und endgültig. Wir können keine Instanzvariablen deklarieren

  2. abstrakte Klasse: Die abstrakte Klasse kann über den Zustand des Objekts sprechen

    Schnittstelle: Die Schnittstelle kann niemals über den Zustand des Objekts sprechen

  3. abstrakte Klasse: Innerhalb der abstrakten Klasse können wir Konstruktoren deklarieren

    Schnittstelle: Innerhalb der Schnittstelle können wir keine Konstruktoren deklarieren, da der Zweck von
    Konstruktoren darin besteht, Instanzvariablen zu initialisieren. Also , was ist die Notwendigkeit des Konstruktor da , wenn wir keine Instanzvariablen in Schnittstellen haben .

  4. abstrakte Klasse: Innerhalb der abstrakten Klasse können wir Instanz- und statische Blöcke deklarieren

    Schnittstelle: Schnittstellen dürfen keine Instanz- und statischen Blöcke enthalten.

  5. abstrakte Klasse: Die abstrakte Klasse kann keinen Lambda-Ausdruck referenzieren

    Schnittstellen: Schnittstellen mit einer einzelnen abstrakten Methode können auf Lambda-Ausdrücke verweisen

  6. abstrakte Klasse : Innerhalb der abstrakten Klasse können wir OBJECT CLASS-Methoden überschreiben

    Schnittstellen: Wir können OBJECT CLASS-Methoden innerhalb von Schnittstellen nicht überschreiben.

Ich werde mit dem Hinweis enden, dass:

Standardmethodenkonzepte / statische Methodenkonzepte in der Schnittstelle dienten nur dazu, Implementierungsklassen zu speichern, aber keine sinnvolle nützliche Implementierung bereitzustellen. Standardmethoden / statische Methoden sind eine Art Dummy-Implementierung. "Wenn Sie möchten, können Sie sie verwenden oder überschreiben (bei Standardmethoden) in der Implementierungsklasse." Dies erspart uns die Implementierung neuer Methoden in Implementierungsklassen, wenn neue Methoden in Schnittstellen verwendet werden sind hinzugefügt. Daher können Schnittstellen niemals abstrakten Klassen entsprechen.

Umar Tahir
quelle
5

Die Remi Forax- Regel lautet: Sie entwerfen nicht mit abstrakten Klassen. Sie gestalten Ihre App mit Schnittstellen . Was auch immer die Version von Java ist, was auch immer die Sprache ist. Es wird von dem gesicherten I nterface Segregation Prinzip in SOL I D Prinzipien.

Sie können später abstrakte Klassen verwenden, um Code zu faktorisieren. Mit Java 8 können Sie dies jetzt direkt in der Benutzeroberfläche tun. Dies ist eine Einrichtung, nicht mehr.

Nicolas Zozol
quelle
2

Wann sollte eine Schnittstelle mit Standardmethoden verwendet werden und wann sollte eine abstrakte Klasse verwendet werden?

Abwärtskompatibilität: Stellen Sie sich vor, Ihre Schnittstelle wird von Hunderten von Klassen implementiert. Wenn Sie diese Schnittstelle ändern, werden alle Benutzer gezwungen, die neu hinzugefügte Methode zu implementieren, obwohl dies für viele andere Klassen, die Ihre Schnittstelle implementieren, möglicherweise nicht unbedingt erforderlich ist. Außerdem ermöglicht es Ihre Schnittstelle eine funktionale Schnittstelle sein

Fakten & Einschränkungen:

1-Darf nur innerhalb einer Schnittstelle und nicht innerhalb einer Klasse oder abstrakten Klasse deklariert werden.

2-Muss einen Körper bereitstellen

3-Es wird nicht angenommen, dass es abstrakt ist wie andere normale Methoden, die in einer Schnittstelle verwendet werden.

Ahmad Sanie
quelle
1

In Java 8 sieht eine Schnittstelle wie eine abstrakte Klasse aus, obwohl es einige Unterschiede geben kann, wie z.

1) Abstrakte Klassen sind Klassen, daher sind sie nicht auf andere Einschränkungen der Schnittstelle in Java beschränkt, z. B. können abstrakte Klassen den Status haben , aber Sie können den Status auf der Schnittstelle in Java nicht haben.

2) Ein weiterer semantischer Unterschied zwischen der Schnittstelle mit Standardmethoden und der abstrakten Klasse besteht darin, dass Sie Konstruktoren innerhalb einer abstrakten Klasse definieren können, aber keinen Konstruktor innerhalb der Schnittstelle in Java definieren können

Manish Sahni
quelle
Ich stimme # 2 zu, aber für # 1 können Sie nicht einfach die Schnittstelle implementieren und somit einen Status über die Implementierungsklasse haben?
George Xavier
0

Standardmethoden in der Java-Schnittstelle sollen eher zur Bereitstellung einer Dummy-Implementierung einer Funktion verwendet werden, wodurch jede implementierende Klasse dieser Schnittstelle vor dem Problem bewahrt wird, alle abstrakten Methoden zu deklarieren, selbst wenn sie nur eine behandeln möchten. Standardmethoden in der Schnittstelle sind somit eher ein Ersatz für das Konzept der Adapterklassen.

Die Methoden in der abstrakten Klasse sollen jedoch eine sinnvolle Implementierung liefern, die jede untergeordnete Klasse nur überschreiben sollte, wenn dies zum Überschreiben einer gemeinsamen Funktionalität erforderlich ist.

shubh
quelle
0

Wie in anderen Antworten erwähnt, wurde die Möglichkeit hinzugefügt, einer Schnittstelle eine Implementierung hinzuzufügen, um die Abwärtskompatibilität im Collections-Framework zu gewährleisten. Ich würde argumentieren, dass die Bereitstellung von Abwärtskompatibilität möglicherweise der einzige gute Grund ist, einer Schnittstelle eine Implementierung hinzuzufügen.

Wenn Sie andernfalls einer Schnittstelle eine Implementierung hinzufügen, verstoßen Sie gegen das Grundgesetz, warum Schnittstellen überhaupt hinzugefügt wurden.Java ist im Gegensatz zu C ++ eine einzelne Vererbungssprache, die eine Mehrfachvererbung ermöglicht. Schnittstellen bieten die Tippvorteile einer Sprache, die Mehrfachvererbung unterstützt, ohne die Probleme einzuführen, die mit Mehrfachvererbung verbunden sind.

Insbesondere erlaubt Java nur die einmalige Vererbung einer Implementierung, jedoch die mehrfache Vererbung von Schnittstellen. Folgendes ist beispielsweise gültiger Java-Code:

class MyObject extends String implements Runnable, Comparable { ... }

MyObject erbt nur eine Implementierung, aber drei Verträge.

Java hat die Mehrfachvererbung der Implementierung weitergegeben, da die Mehrfachvererbung der Implementierung mit einer Vielzahl heikler Probleme verbunden ist, die außerhalb des Rahmens dieser Antwort liegen. Schnittstellen wurden hinzugefügt, um die Mehrfachvererbung von Verträgen (auch als Schnittstellen bezeichnet) ohne die Probleme der Mehrfachvererbung der Implementierung zu ermöglichen.

Um meinen Standpunkt zu unterstützen, hier ein Zitat von Ken Arnold und James Gosling aus dem Buch The Java Programming Language, 4. Auflage :

Eine einzelne Vererbung schließt einige nützliche und korrekte Entwürfe aus. Die Probleme der Mehrfachvererbung ergeben sich aus der Mehrfachvererbung der Implementierung, aber in vielen Fällen wird die Mehrfachvererbung verwendet, um eine Reihe abstrakter Verträge und möglicherweise eine konkrete Implementierung zu erben. Die Bereitstellung eines Mittels zum Erben eines abstrakten Vertrags ohne Erben einer Implementierung ermöglicht die Typisierungsvorteile der Mehrfachvererbung ohne die Probleme der Mehrfachimplementierungsvererbung. Die Vererbung eines abstrakten Vertrags wird als Schnittstellenvererbung bezeichnet . Die Programmiersprache Java unterstützt die Vererbung von Schnittstellen, indem Sie einen interfaceTyp deklarieren können

Johnnyodonnell
quelle
-1

Bitte denken Sie zuerst an das offene / geschlossene Prinzip. Die Standardmethoden in Schnittstellen VERLETZEN es. Dies ist eine schlechte Funktion in Java. Es fördert schlechtes Design, schlechte Architektur und niedrige Softwarequalität. Ich würde vorschlagen, die Verwendung von Standardmethoden vollständig zu vermeiden.

Stellen Sie sich ein paar Fragen: Warum können Sie Ihre Methoden nicht in die abstrakte Klasse einordnen? Benötigen Sie dann mehr als eine abstrakte Klasse? Denken Sie dann darüber nach, wofür Ihre Klasse verantwortlich ist. Sind Sie sicher, dass alle Methoden, die Sie der einzelnen Klasse zuordnen, wirklich denselben Zweck erfüllen? Möglicherweise unterscheiden Sie mehrere Zwecke und teilen Ihre Klasse dann in mehrere Klassen auf, für jeden Zweck eine eigene Klasse.

Mentallurg
quelle