Signatur einer Methode in JAVA

Diskutiere Signatur einer Methode in JAVA im Java Basics - Anfänger-Themen Bereich.
R

rammi22

Hallo,

was bedeutet konkret "Signatur einer Methode"?

Wenn ich nach meiner Internetsuche gehe, gehört zu einer Signatur der MethodenName und die Parametertypen, also
Java:
public void calculate(int x, int y) {
    // Signatur der Methode: calculate(int, int)
}
Dazu auch das Zitat aus dem Buch "JAVA ist auch eine Insel"
Der Methodenname und die Parameterliste bestimmen die Signatur einer Methode; der Rückgabetyp und Ausnahmen gehören nicht dazu.
...
Nun sitze ich hier mit einem Buch, welches über Entwurfmuster (Pattern) informiert. Für das Command Pattern wird zur Klassenreduzierung statt der Übergabe von Objekten an die setterCommand() des Invoker die Übergabe eines Lambda-Ausdruck empfohlen, also statt
Java:
...
// Invoker   
FernSteuerung fernSteuerung = new FernSteuerung();
// Receiver
Licht licht = new Licht("Wohnzimmer");
// ConcreteCommand
LichtAnBefehl wohnzimmerBeleuchtungAn = new LichtAnBefehl(licht);
...
// set command/s   
fernSteuerung.setCommand(
    0,
    wohnzimmerBeleuchtungAn,
    ...
);
...
wird im fernsteuerung.setBefehl() der Parameter wohnzimmerBeleuchtungAn als Lambda-Ausdruck übergeben:
Java:
...
// set command/s
fernSteuerung.setCommand(
    0,
    () -> { wohnzimmerBeleuchtung.on(); },
    ...
};
Ok, es wird erklärt, wie das so funktionieren soll:
...und das Befehl-Interface hat nur eine einzige Methode: ausführen() [Anmerkung: execute()]. Der Lambda-Ausdruck, den wir nutzen,
muss eine mit dieser Methode kompatible Methode haben, und das hat er:
ausführen()[Anmerkung: execute()] erwartet keine Argumente (wie unser Lambda-Ausdruck) und liefert
keinen Wert (auch das trifft auf unseren Lambda-Ausdruck zu) – und das macht
den Compiler glücklich.
...
Merken Sie sich einfach: Das funktioniert, solange die Schnittstelle des
Parameters, an den wir den Lambda-Ausdruck übergeben, nur eine Methode hat
und die Signatur dieser Methode mit der der Lambda-Methode übereinstimmt.
Laut dieser Erklärung reicht für eine gültige Signatur die Parameter- und die Rückgabewerte. Aber das stimmt so mal gar nicht mit der o.g. Definition überein....


Die setter-Methode im Invoker Class FernSteuerung
Java:
// Class FernSteuerung
...
    public void setCommand(int slot, ICommand onCommand, ...) {
        ...
    }
...
...und das dazugehörige Interface mit nur einer Methode
Java:
// ICommand
public interface ICommand {
   public void execute();
}
}
...und das dazugehörige Interface mit nur einer Methode
Java:
// ICommand
public interface ICommand {
   public void execute();
}
...und die LichtKlasse
Java:
// Class Licht
...
    public void on() {
        System.out.println(location + " light is on");
    }
...
Genau so ist ist der Besipielcode aus dem Lehrbuch mitgeliefert wurden.
Zu meiner Frage: Wie kennen sich die Methoden aus dem Interface execute() und aus der Licht-Klasse über den Lambda-Ausdruck, wenn doch der Name als Teil der Signatur nicht übereinstimmt?
Der Rest stimmt ja, keine

Ich komme aus der PHP-Ecke und vertraue einfach das der Code in JAVA funktioniert. Ich selber in JAVA compile nichts, sondern ich (versuche) die Geschichte in PHP zu übersetzen.

Vielen Dank für jegliche Erleuchtung zu Thema
 
H

httpdigest

Hier ist der Satz "und die Signatur dieser Methode mit der der Lambda-Methode übereinstimmt" tatsächlich falsch, wenn man mit Signatur die Methodensignatur meint, wie sie durch die Java Language Specification (JLS) definiert ist [1].
Die Bedingungen, damit ein Lambda-Ausdruck als Argument bzw. Zuweisung an einen Typ `T` gültig ist, definiert auch das JLS bei [2].

[1]: https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.2
[2]: https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.27.3
 
W

White_Fox

Doch, der Name der Methode gehört auch dazu. Wie willst du sonst z.B.
Java:
public void addObjectToCoordinates(int x, int y){}
und
Java:
public void removeObjectFromCoordinates(int x, int y){}
auseinanderhalten?

Siehe auch hier:
 
H

httpdigest

Es ging hier aber streng genommen nicht um die Methodensignatur, sondern darum, was gegeben sein muss, damit eine Lambdafunktion kompatibel zu einem Zieltyp/-interface ist.
Die JLS nennt das "Kongruenz".
 
Thema: 

Signatur einer Methode in JAVA

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben