5

Ich versuche, Java selbst zu unterrichten und hatte eine Frage, die ich bisher nicht beantworten konnte. In einigen meiner Online-Lektüre habe ich zwei Möglichkeiten gefunden, Action-Listener zu verwenden, die das gleiche zu tun scheinen. Aber ich versuche herauszufinden, was der Vorteil/Nachteil von einem gegenüber dem anderen ist.Java-Aktion Listener: implementiert vs anonyme Klasse

Ist es besser, anonyme Klasse wie folgt zu verwenden:

public MyClass() { 
... 
    myButton.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e) { 
      //doSomething 
     } 
    }); 
... 
} 

oder ist es am besten zu Beginn der Klasse zu implementieren, wie so:

public MyClass() implements ActionListener { 
... 
    myButton.addActionListener(this); 

    public void actionPerformed(ActionEvent e) { 
     //doSomething 
    } 
... 
} 
+1

Mögliches Duplikat: http://stackoverflow.com/questions/5451010/nested-class-vs-implements-actionlistener –

Antwort

1

Das kommt auf eine Stilsache wirklich. Beide werden im Code genauso ausgeführt.

Die separate Klasse tendiert dazu, den Code in Ihrer eigentlichen Methode einfacher zu halten, während die anonyme innere Klasse den Code für die Listener-Implementierung in die Methode einbezieht, wodurch klarer wird, was sie tut.

Es gibt auch den Fall, dass anonyme innere Klassen auf finale Variablen in der Methode zugreifen können, die sie erstellt. Sie können das nicht mit einer vordefinierten Klasse (obwohl Sie die Variablen in den Controller übergeben können).

Der separate Code ist wiederverwendbar - wenn Sie also an mehreren Stellen den gleichen Listener haben, ist er der klare Gewinner.

3

Nur wenn Ihre Klasse ist wirklich ein ActionListener (is-a-Beziehung) und wird an anderer Stelle als ActionListener verwendet, sollte ActionListener implementiert werden.

Wenn es nur intern als ActionListener verwendet wird, würde die Implementierung von ActionListener Implementierungsdetails an die API der Klasse verlieren. Verwenden Sie in diesem Fall die Komposition (Has-a-Beziehung).

Dies gilt auch für andere Schnittstellen und Superklassen.

0

Wenn Sie eine anonyme Klasse verwenden, ist der Code besser lesbar, aber Sie können ihn nicht erneut verwenden.

Also, ich würde nur eine anonyme Klasse verwenden, wenn sie kurz ist und ich bin absolut sicher, dass ich sie nirgendwo mehr verwenden muss.