630 Stimmen

Wann verwenden: Java 8+ Interface-Standardmethode vs. abstrakte Methode

Java 8 ermöglicht die Standardimplementierung von Methoden in Interfaces, die als Default Methods bezeichnet werden.

Ich bin verwirrt darüber, wann ich diese Art von Interface-Standardmethode verwenden sollte, anstelle einer abstrakten Klasse (mit abstrakten Methoden).

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

20voto

Andrey Chaschev Punkte 15685

Diese beiden sind ziemlich unterschiedlich:

Standardmethoden dienen dazu, externe Funktionalität zu bestehenden Klassen hinzuzufügen, ohne ihren Zustand zu ändern.

Und abstrakte Klassen sind ein normaler Typ von Vererbung, es handelt sich um normale Klassen, die erweitert werden sollen.

18voto

Umar Tahir Punkte 546

Auch wenn es eine alte Frage ist, lasst mich auch meinen Beitrag dazu geben.

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

    Schnittstelle: Innerhalb einer Schnittstelle ist jede Variable immer öffentlich, statisch und final. Wir können keine Instanzvariablen deklarieren

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

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

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

    Schnittstelle: Innerhalb einer Schnittstelle können wir keine Konstruktoren deklarieren, da der Zweck von Konstruktoren ist, Instanzvariablen zu initialisieren. Also, was ist der Sinn eines Konstruktors, wenn wir keine Instanzvariablen in Schnittstellen haben können.

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

    Schnittstelle: Schnittstellen können keine Instanz- und statischen Blöcke haben.

  5. abstrakte Klasse: Eine abstrakte Klasse kann keine Lambda-Ausdrücke enthalten

    Schnittstellen: Schnittstellen mit einer einzigen abstrakten Methode können Lambda-Ausdrücke enthalten

  6. abstrakte Klasse: Innerhalb einer abstrakten Klasse können wir METHODEN DER OBJEKTKLASSE überschreiben

    Schnittstellen: Wir können METHODEN DER OBJEKTKLASSE innerhalb von Schnittstellen nicht überschreiben.

Ich möchte abschließend festhalten, dass:

Konzepte der Standardmethode/Konzepte der statischen Methode in Schnittstellen wurden nur eingeführt, um Implementierungsklassen zu sparen, aber nicht um sinnvolle nützliche Implementierungen bereitzustellen. Standardmethoden/ Statische Methoden sind eine Art Dummy-Implementierung, "wenn du willst, kannst du sie verwenden oder du kannst sie überschreiben (im Falle von Standardmethoden) in der Implementierungsklasse" Dadurch werden wir davor bewahrt, neue Methoden in Implementierungsklassen hinzufügen zu müssen, wann immer neue Methoden in Schnittstellen hinzugefügt werden. Daher können Schnittstellen niemals abstrakten Klassen gleichgestellt werden.

15voto

Ravindra babu Punkte 45577

In Bezug auf Ihre Anfragen:

Q1: Ich bin verwirrt darüber, wann ich diese Art von Standardmethoden einer Schnittstelle verwenden sollte, anstelle einer abstrakten Klasse (mit abstrakten Methoden)

Laut der Oracle-Dokumentation zu Standardmethoden

Standardmethoden ermöglichen es Ihnen, neue Funktionalitäten zu den Schnittstellen Ihrer Bibliotheken hinzuzufügen und eine binäre Kompatibilität mit Code sicherzustellen, der für ältere Versionen dieser Schnittstellen geschrieben wurde.

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

Die Oracle-Dokumentation bietet die perfekte Antwort.

Abstrakte Klassen im Vergleich zu Schnittstellen:

Abstrakte Klassen ähneln Schnittstellen. Sie können nicht instanziiert werden und können eine Mischung aus Methoden enthalten, die mit oder ohne Implementierung deklariert sind.

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 von Ihnen deklarierten oder definierten Methoden (als Standardmethoden) sind öffentlich.

Sie können nur eine Klasse erweitern, unabhängig davon, ob sie abstrakt ist oder nicht. Aber Sie können beliebig viele Schnittstellen implementieren.

Verwendungszwecke von abstrakten Klassen:

  1. Sie haben keine Implementierung in der Basisklasse (mit gemeinsamen Daten) und nur die Unterklasse müssen ihre eigene Implementierung definieren. Sie benötigen eine abstrakte Klasse anstelle einer Schnittstelle, da Sie den Zustand mit den Unterklassen teilen möchten.

  2. Abstrakte Klassen werden in der Implementierung des Muster des abstrakten Fabrik entwurfs verwendet (erzeugungsmuster)

    Beispiel: Fabrik-Muster. Wann sollen Fabrikmethoden verwendet werden?

  3. Sie können viele Anwendungsfälle von abstrakten Klassen in Entwurfsmustern finden.

    Beispiel: Bridge-Muster (Strukturmuster)

    Trennt das Bridge-Muster eine Abstraktion von einer Implementierung?

  4. Abstrakte Klassen werden im Decorator-Entwurfsmuster verwendet

    Beispiel: Wann sollte das Decorator-Muster verwendet werden?

  5. Abstrakte Klasse ist am besten geeignet für das Vorlage-Methode-Muster, bei dem Sie ein Skelett erstellen müssen.

    Beispiel: Vorlagendesignmuster in JDK, konnte keine Methode finden, die eine Reihe von Methoden definiert, die in einer bestimmten Reihenfolge ausgeführt werden sollen

9voto

kiriloff Punkte 24291

Standardmethoden in Java-Schnittstelle ermöglichen Schnittstellenevolution.

Wenn Sie einer vorhandenen Schnittstelle eine Methode hinzufügen möchten, ohne die binäre Kompatibilität mit älteren Versionen der Schnittstelle zu beeinträchtigen, haben Sie zwei Optionen zur Auswahl: eine Standardmethode oder eine statische Methode hinzufügen. Tatsächlich 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 einzigartig für eine Klasse. Eine Standardmethode ist einzigartig für eine Instanz der Klasse.

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

  • die Standardmethode implementieren und sie überschreibt die Implementierung in der implementierten Schnittstelle.
  • die Methode erneut deklarieren (ohne Implementierung), was sie abstrakt macht.
  • nichts tun (dann wird einfach die Standardmethode aus der implementierten Schnittstelle vererbt).

Mehr zum Thema hier.

6voto

Nicolas Zozol Punkte 6855

Remi Forax Regel ist Sie entwerfen nicht mit abstrakten Klassen. Sie entwerfen Ihre App mit Schnittstellen. Egal, welche Java-Version, egal, welche Sprache. Es wird unterstützt durch das Schnittstellensegregationsprinzip in den SOLID-Prinzipien.

Sie können später abstrakte Klassen verwenden, um Code zu faktorisieren. Jetzt mit Java 8 können Sie es direkt in der Schnittstelle tun. Dies ist eine Erleichterung, nicht mehr.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X