Hallo,
was bedeutet konkret "Signatur einer Methode"?
Wenn ich nach meiner Internetsuche gehe, gehört zu einer Signatur der MethodenName und die Parametertypen, also
Dazu auch das Zitat aus dem Buch "JAVA ist auch eine Insel"
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
wird im
Ok, es wird erklärt, wie das so funktionieren soll:
Die setter-Methode im Invoker Class FernSteuerung
...und das dazugehörige Interface mit nur einer Methode
...und das dazugehörige Interface mit nur einer Methode
...und die LichtKlasse
Genau so ist ist der Besipielcode aus dem Lehrbuch mitgeliefert wurden.
Zu meiner Frage: Wie kennen sich die Methoden aus dem Interface
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
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)
}
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,
...
);
...
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:
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.......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.
Die setter-Methode im Invoker Class FernSteuerung
Java:
// Class FernSteuerung
...
public void setCommand(int slot, ICommand onCommand, ...) {
...
}
...
Java:
// ICommand
public interface ICommand {
public void execute();
}
}
Java:
// ICommand
public interface ICommand {
public void execute();
}
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