einzelner ActionListener vs anonyme ActionListener

Blender3D

Top Contributor
Bezug nehmend auf mein einfaches Test Programm habe ich es nun hinbekommen den leeren Graph im Panel anzuzeigen 🙂

Hier der Code:
[..., siehe #19]
3) Du erzeugst 2 ActionListener die den Listener dann an private Funktionen weiterleiten. Besser GraphPanel implementiert den ActionListener und du reagierst dort auf die Ereignisse. --> Viel übersichtlicher im Code.

Java:
    @Override
    public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();
        if (source == jBStart) {
            System.out.println("start");
        }

        if (source == jBExit) {
            System.out.println("exit");
        }
    }
 
Zuletzt bearbeitet von einem Moderator:
3) Du erzeugst 2 ActionListener die den Listener dann an private Funktionen weiterleiten. Besser GraphPanel implementiert den ActionListener und du reagierst dort auf die Ereignisse. --> Viel übersichtlicher im Code.
Dieser Tipp ist aber Unsinn. Eine Methode pro Aktion ist deutlich besser, als eine Methode für alle Aktionen - völlig unabhängig, ob nun ActionListener oder sonstwas.
 
Zuletzt bearbeitet:
Habs mal abgespalten, da's mit dem anderem Thema nicht viel zu tun hat, aber ein ganz interessantes Thema ist...
 
Dann schau Dir an welcher Code besser zu lesen ist.

Java:
    @Override
    public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();
        if (source == jBStart) {
            System.out.println("start");
        }

        if (source == jBExit) {
            System.out.println("exit");
        }
    }

vs
Java:
private void jBStartActionPerformed(ActionEvent evt) {
     System.out.println("start");//Inhalt angepasst, damit das gleiche passiert
}

private void jBExitActionPerformed(ActionEvent evt) {
    System.out.println("exit");
}


Naja, sieht für mich ziemlich eindeutig aus...

* keine Verzweigung nötig (= Übersichtlicher)
* eine Methode pro Aktion (SRP...), bessere Benennung wäre aber durchaus möglich
* Buttons müssen keine Felder sein (= kleinerer Scope = weniger Fehlermöglichkeiten)
* kürzerer Code (wenn man das zu Methodenreferenzen kürzt, was jede gute IDE da macht) (für mich kein Argument, für viele aber schon)

Ich wüsste nicht, was für das implements ActionListener... spricht (was ja nebenbei auch noch den Typ der Klasse erweitert)?
 
Naja, sieht für mich ziemlich eindeutig aus...
Java:
    // add Listeners
        jBStart.addActionListener(this);
        jBExit.addActionListener(this);
Java:
    jBStart.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent evt) {
                        jBStartActionPerformed(evt);
                    }
                });
        jBExit.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent evt) {
                        jBExitActionPerformed(evt);
                    }
                });
Also für mich sieht es nicht so aus. 😉
 
Java:
    // add Listeners
        jBStart.addActionListener(this);
        jBExit.addActionListener(this);
Java:
    jBStart.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent evt) {
                        jBStartActionPerformed(evt);
                    }
                });
        jBExit.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent evt) {
                        jBExitActionPerformed(evt);
                    }
                });
Also für mich sieht es nicht so aus. 😉
In dem einem Fall sehe ich direkt, was eigentlich gemacht wird, in dem anderen muss ich mich erst durch eine weitere Methode wühlen 😉

Aber wie schon gesagt: so gut wie jeder formt das zu Methodenreferenzen um (bzw, jede IDE macht das für einen), dann sieht es so aus:
Java:
jBStart.addActionListener(this::jBStartActionPerformed);
jBExit.addActionListener(this::jBExitActionPerformed);

In den meisten IDEs dürfte das sowieso schon als
Java:
jBExit.addActionListener(ActionListener(ActionEvent e) {jBExitActionPerformed(e)}
oder vergleichbar dargestellt sein.
 
Ist Jigloo nicht nur ein Eclipse-Plugin? Eclipse sollte sowas eigentlich können, IntelliJ IDEA macht's aber auf jeden Fall
 
Ja, richtig - Jigloo ist ein Eclipse Plugin. Ich werde mir bei Gelegenheit mal IntelliJ ansehen, aber erst einmal mit Eclipse und Jigloo weiter machen denn ich jabe ja mit Java schon genug Baustellen 😉

Gruß

Ralf
 

Zurück
Oben