Warum verwendet Java :: für Methodenreferenzen anstelle von.?

7

Ich frage mich oft, warum Java ::anstelle von Methodenreferenzen verwendet ., z. B. warum

  System.out::println

anstatt

  System.out.println

Man könnte natürlich einfach antworten: "weil die Designer das entschieden haben". Andererseits hätte ich die zweite Syntax erwartet, da der Punkt die übliche Java-Syntax für den Zugriff auf Klassenmitglieder ist.

Gibt es also einen bekannten besonderen Grund für die Einführung der neuen ::Syntax, anstatt die vorhandene .Konvention für Methodenreferenzen zu verwenden?

Giorgio
quelle

Antworten:

20

Dies dient dazu, Mehrdeutigkeiten zu vermeiden, falls die Klasse ein (statisches) Mitglied mit demselben Namen wie die Methode hat (Java erlaubt dies).

Aus dem Code-Snippet im Java-Tutorial ist leicht ersichtlich, welche Methodenreferenzen vorliegen :

Da dieser Lambda-Ausdruck eine vorhandene Methode aufruft, können Sie anstelle eines Lambda-Ausdrucks eine Methodenreferenz verwenden:

Arrays.sort(rosterAsArray, Person::compareByAge);

Wenn die Klasse Personim obigen Snippet auch ein Mitglied mit dem Namen compareByAge(des Typs, an den übergeben werden soll Arrays.sort) hätte, würde die Punktnotation nicht zulassen, ob sich der Parameter auf eine Methode oder ein Mitglied bezieht.

Mücke
quelle
2
Vielen Dank für die Antwort und entschuldigen Sie meine Unwissenheit: Ich wusste nicht, dass Mitgliedsvariablen und -methoden denselben Namen haben dürfen. +1
Giorgio
3

Sie haben eine neue Syntax eingeführt, weil das Verhalten nicht dasselbe ist.

Dies .bedeutet, dass Sie eine Referenz auf die Funktion erhalten möchten, um sie direkt danach aufzurufen .

Wenn Sie method reference ( ::) verwenden, möchten Sie eine Referenz in der Funktion speichern, diese jedoch nicht sofort aufrufen .

Ein praktischerer Aspekt ist, wie würden Sie zwischen einem öffentlichen Attribut und einer Methode mit demselben Namen mit dem unterscheiden .? Das kannst du einfach nicht. Mit ::gibt es keine Mehrdeutigkeit mehr.

Gepunktet
quelle
"Das. Bedeutet, die Funktion aufzurufen und ihren Code buchstäblich auszuführen." Nein, der Punkt bedeutet, auf das Mitglied zuzugreifen. Die Klammern bedeuten, dass die Funktion in Sprachen mit C-Syntax (wie Java) aufgerufen wird.
Miles Rout
1
@MilesRout In der Tat ist meine Antwort verwirrend, ich habe sie bearbeitet, um meine Gedanken besser zu klären.
Spotted