Ich nutze wenig von den Möglichkeiten, allerdings verwende ich schon Kurzschreibweisen wie statt
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
machWas();
}
});
button.addActionListener(e -> machWas());
Ich frag mich nur, woher weiß der Compiler eigentlich genau, was er da machen soll. Meine Vermutung
- Die Methode addActionListener() hat genau einen Parameter und dieser ist vom bekannten Typ ActionListener, also muss der Compiler davon einen erzeugen.
- Der Typ ActionListener hat nur eine Methode, die man zu überschrieben hat, nämlich actionPerformed(). Also muss wohl gemeint sein, dass deren Verhalten hier festgelegt werden soll.
- Die Methode actionPerformed() hat nur genau einen Parameter, nämlich das ActionEvent .
- Also muss mit e ein solches ActionEvent gemeint sein.
Stimmt das? Irgendwie wirkt das schon ein bisschen wie Voodoo, aber um dafür den ganzen „nutzlosen“ und Zeilen fressenden Code zur Erstellung des ActionListeners von Hand zu vermeiden, nutze ich es trotzdem. Ich hätte nur gern ein besseres Gefühl dabei.
Bei einer eigenen Suche bin ich auf die Seite
gestoßen. Dort entnehme ich, dass „mein“ obiger Code ein verkürzter Lamdaausdruck zu
button.addActionListener( (ActionEvent e) -> (machWas();) );
ist, wenn ich das richtig verstanden habe.
Außerdem steht dort
Das klingt irgendwie ziemlich cool, aber offenbar hab ich diese Lambdas noch nicht ausreichend benutzt, um gefühlsmäßig mit ihnen vertraut zu sein. Vielleicht hat jemand hier ja noch einen guten Tipp für mein Verständnis oder weitere schlaue Links?