bedeutung - java interface default method



Was ist der Zweck des Standardschlüsselworts in Java? (6)

Eine Schnittstelle in Java ähnelt einer Klasse, der Hauptteil einer Schnittstelle kann jedoch nur abstrakte Methoden und final Felder (Konstanten) enthalten.

Kürzlich habe ich eine Frage gesehen, die so aussieht

interface AnInterface {
    public default void myMethod() {
        System.out.println("D");
    }
}

Gemäß der Schnittstellendefinition sind nur abstrakte Methoden zulässig. Warum kann ich den obigen Code kompilieren? Was ist das default ?

Auf der anderen Seite, als ich versuchte, unter Code zu schreiben, heißt es, modifier default not allowed here

default class MyClass{

}

Anstatt von

class MyClass {

}

Kann mir jemand den Zweck des default Keywords mitteilen? Darf es nur innerhalb einer Schnittstelle sein? Wie unterscheidet es sich von der default (kein Zugriffsmodifikator)?

https://src-bin.com


Answer #1

Eine sehr gute Erklärung finden Sie in den Java ™ -Anleitungen . Ein Teil der Erklärung lautet wie folgt:

Betrachten Sie ein Beispiel, bei dem Hersteller von computergesteuerten Autos branchenübliche Schnittstellen veröffentlichen, die beschreiben, welche Methoden zum Betreiben ihrer Autos aufgerufen werden können. Was ist, wenn diese computergesteuerten Autohersteller ihren Autos neue Funktionen wie das Fliegen hinzufügen? Diese Hersteller müssten neue Methoden festlegen, damit andere Unternehmen (z. B. Hersteller elektronischer Leitinstrumente) ihre Software an fliegende Autos anpassen können. Wo würden diese Autohersteller diese neuen flugbezogenen Methoden deklarieren? Wenn sie zu ihren ursprünglichen Schnittstellen hinzugefügt werden, müssen Programmierer, die diese Schnittstellen implementiert haben, ihre Implementierungen neu schreiben. Wenn sie als statische Methoden hinzugefügt werden, werden sie von Programmierern als Dienstprogrammmethoden und nicht als wesentliche Kernmethoden betrachtet.

Mit Standardmethoden können Sie den Schnittstellen Ihrer Bibliotheken neue Funktionen hinzufügen und die Binärkompatibilität mit Code sicherstellen, der für ältere Versionen dieser Schnittstellen geschrieben wurde.


Answer #2

Es ist eine neue Funktion in Java 8, mit der eine interface eine Implementierung bereitstellen kann. Beschrieben in Java 8 JLS-13.5.6. Interface-Methodendeklarationen, die (teilweise) lesen

Das Hinzufügen einer default oder das Ändern einer Methode von " abstract in " default beeinträchtigt nicht die Kompatibilität mit bereits vorhandenen Binärdateien, kann jedoch zu einem IncompatibleClassChangeError wenn eine bereits vorhandene Binärmethode versucht, die Methode aufzurufen. Dieser Fehler tritt auf, wenn der qualifizierende Typ T ein Subtyp von zwei Schnittstellen I und J , wobei sowohl I als auch J eine default mit derselben Signatur und demselben Ergebnis deklarieren und weder I noch J eine Subschnittstelle der anderen ist.

Was ist neu in JDK 8 sagt (teilweise)

Standardmethoden ermöglichen das Hinzufügen neuer Funktionen zu den Schnittstellen von Bibliotheken und gewährleisten die Binärkompatibilität mit Code, der für ältere Versionen dieser Schnittstellen geschrieben wurde.


Answer #3

Java 8 wurde in erster Linie um Standardmethoden zur Unterstützung von Lambda-Ausdrücken erweitert. Die Designer haben (meiner Ansicht nach geschickt) beschlossen, Lambdas-Syntax für die Erstellung anonymer Implementierungen einer Schnittstelle zu erstellen. Da Lambdas jedoch nur eine einzige Methode implementieren können, wären sie auf Schnittstellen mit einer einzigen Methode beschränkt, was eine ziemlich strenge Einschränkung darstellt. Stattdessen wurden Standardmethoden hinzugefügt, um die Verwendung komplexerer Schnittstellen zu ermöglichen.

Wenn Sie sich von der Behauptung überzeugen möchten, dass die default aufgrund von Lambdas eingeführt wurde, beachten Sie, dass der Strohmann-Vorschlag von Project Lambda von Mark Reinhold aus dem Jahr 2009 „Erweiterungsmethoden“ als obligatorisches Feature zur Unterstützung von Lambdas erwähnt.

Hier ist ein Beispiel, das das Konzept demonstriert:

interface Operator {
    int operate(int n);
    default int inverse(int n) {
        return -operate(n);
    }
}

public int applyInverse(int n, Operator operator) {
    return operator.inverse(n);
}

applyInverse(3, n -> n * n + 7);

Sehr ausgeklügelt ist mir klar, aber ich sollte veranschaulichen, wie default Lambdas unterstützt. Da inverse ein Standardwert ist, kann es bei Bedarf leicht von einer implementierenden Klasse überschrieben werden.


Answer #4

Mit Standardmethoden können Sie den Oberflächen Ihrer Apps neue Funktionen hinzufügen. Es kann auch für eine Mehrfachvererbung verwendet werden . Zusätzlich zu Standardmethoden können Sie statische Methoden in Schnittstellen definieren. Dies erleichtert Ihnen das Organisieren von Hilfsmethoden


Answer #5

Standardmethoden in einer Schnittstelle ermöglichen es uns, neue Funktionen hinzuzufügen, ohne alten Code zu beschädigen.

Wenn vor Java 8 einer Schnittstelle eine neue Methode hinzugefügt wurde, mussten alle Implementierungsklassen dieser Schnittstelle diese neue Methode überschreiben, auch wenn sie die neue Funktionalität nicht verwendeten.

Mit Java 8 können wir die Standardimplementierung für die neue Methode hinzufügen, indem wir das default vor der Methodenimplementierung verwenden.

Selbst bei anonymen Klassen oder funktionalen Schnittstellen können wir Standardimplementierungen dieser Codes erstellen und diese wiederverwenden, wenn wir feststellen, dass ein Teil des Codes wiederverwendbar ist und nicht überall im Code dieselbe Logik definieren möchten.

Beispiel

public interface YourInterface {
    public void doSomeWork();

    //A default method in the interface created using "default" keyword
    default public void doSomeOtherWork(){

    System.out.println("DoSomeOtherWork implementation in the interface");
       }
    }

    class SimpleInterfaceImpl implements YourInterface{

     /*
     * Not required to override to provide an implementation
     * for doSomeOtherWork.
     */
      @Override
      public void doSomeWork() {
  System.out.println("Do Some Work implementation in the class");
   }

 /*
  * Main method
  */
 public static void main(String[] args) {
   SimpleInterfaceImpl simpObj = new SimpleInterfaceImpl();
   simpObj.doSomeWork();
   simpObj.doSomeOtherWork();
      }
   }

Answer #6

Was in den anderen Antworten übersehen wurde, war seine Rolle in Anmerkungen. Bereits in Java 1.5 wurde das default , um einen Standardwert für ein Anmerkungsfeld bereitzustellen .

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Processor {
    String value() default "AMD";
}

Die Verwendung wurde mit der Einführung von Java 8 überlastet , um die Definition einer Standardmethode in Interfaces zu ermöglichen.

Noch etwas, das übersehen wurde: Der Grund, warum die Deklarationsstandardklasse default class MyClass {} ungültig ist, liegt in der Art und Weise, wie Klassen überhaupt deklariert werden . Es gibt keine Bestimmung in der Sprache, die es erlaubt, dass dieses Schlüsselwort dort erscheint. Es wird jedoch für Deklarationen von Schnittstellenmethoden angezeigt.





default