2016-12-22 4 views
1

Kann jemand das Konzept hinter diesem Code erklären? Ich weiß nicht, wonach ich suchen soll oder wo ich anfangen soll. Ich würde gerne mehr über diese Art der Programmierung erfahren.Java-Schnittstelle und Callback-Methode

private static interface A { 
    void apply(String name, int i, int j); 
} 
private final A method_A = (name, i, j) -> methodOne(name, i, j); 
private final A method_B = (name, i, j) -> methodTwo(name, i, j); 
public void methodOne(String name, int i, int j){ 
    // do something 
} 
public void methodTwo(String name, int i, int j){ 
    // do some other thing 
} 

Dank

Antwort

1

Ihr Code kann tatsächlich dazu simplfied werden:

private static interface A { 
    void apply(String name, int i, int j); 
} 
private final A method_A = this::methodOne; 
private final A method_B = this::methodTwo; 
public void methodOne(String name, int i, int j){ 
    // do something 
} 
public void methodTwo(String name, int i, int j){ 
    // do some other thing 
} 

Die beiden Variablen method_A und method_B sind ganz normale Variablen, die vom Typ sind A. Das Besondere daran ist der Wert, den Sie den Variablen zuweisen - this::methodOne.

Ich nehme an, Sie haben etwas Wissen über Klassen und Schnittstellen und wie ihre Instanzen funktionieren. Wenn nicht, lerne diese Dinge zuerst.

A hat nur eine Methode, so dass Sie sie wie einen Typ behandeln können, der eine Methode "speichert". Ich werde erklären warum.

Vor Java 8, würden Sie so etwas schreiben:

private final A method_A = new A() { 
    @Override 
    public void apply(String name, int i, int j) { 
     EnclosingClass.this.methodOne(name, i, j); 
    } 
}; 

Sie eine anonyme Klasse erstellen, die nur die apply Methode hat. Sehen? Ist das Objekt method_A nichts als eine Implementierung einer Methode?

Da Java 8, können Sie stattdessen schreiben diese Lambda-Ausdruck:

private final A method_A = this::methodOne; 

Wie Sie jetzt vielleicht denken kann, es ist alles syntaktischer Zucker. Sie sagen im Grunde, dass method_AmethdOne speichern wird. Sie können dann method_A umgehen und Sie übergeben tatsächlich die Implementierung einer Methode!

Der neue Stream-API nutzt dies und lässt Sie tun Dinge wie:

someList.stream().forEach(System.out::println); 
+0

Vielen Dank für die Erklärung. Die Verknüpfung ist interessant! – theeminence

+0

@theeminance Wenn Sie der Meinung sind, dass eine Antwort Ihre Frage beantwortet, können Sie sie durch Klicken auf das Häkchen akzeptieren. – Sweeper

+0

Ich habe deine Antwort angenommen – theeminence

2

Da Java 8, Schnittstellen mit einer Nicht-Standard-Methode kann als lambda-expressions ausgedrückt werden. Diese Schnittstellen werden auch als funktionale Schnittstellen bezeichnet.

Ihr Code erzeugt zwei Instanzen der Schnittstelle A als solche Lambda-Ausdrücke, die als Adapter zu den Methoden methodOne und methodTwo implementiert sind.

Im Grunde ist dies eine kompaktere Weise

des Schreibens
... 

private final A method_A = new A{ 
    public void apply(String name, int i, int j){ 
     methodOne(name, i, j); 
    } 
}; 

private final A method_B = new A{ 
    public void apply(String name, int i, int j){ 
     methodOne(name, i, j); 
    } 
}; 

... 
+0

Vielen Dank für die Erklärung. Der von Ihnen bereitgestellte Link erklärt auch viele Dinge im Detail. – theeminence