PDA

View Full Version : [JAVA] Vorrei comprendere questo pezzetto di codice


masteryuri
22-05-2012, 00:48
Non capisco come mai l'argomento della funzione addActionListener abbia un ActionListener e accanto un corpo {...}.
Sono alle prime armi con il Java, qualcuno può aiutarmi?

quitButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
System.exit(0);
}
});

PGI-Bis
22-05-2012, 07:33
quel "new costruttore {}" si chiama creazione di istanza di classe anonima.

E' una forma abbreviata che in passaggio unico fa una cosa che di solito si fa in due:

1) Dichiarazione di una classe che ne estende un'altra o definisce un'interfaccia
2) Creazione di un'istanza di quella classe.

Dire:

quitButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});

Equivale a dire:

class Anonima implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
};
Anonima istanza = new Anonima();
quitButton.addActionListener(istanza);

Insomma, è solo un sollievo per polpastrelli.

masteryuri
22-05-2012, 08:28
Cioè quel "new ActionListener()" da solo come argomento non andava bene perché ActionListener è soltanto un'interfaccia, quindi va implementata da una classe che in questo caso è anonima. Ho capito bene?

PGI-Bis
22-05-2012, 09:26
Sì.

Non puoi istanziare (new) un'interfaccia o una classe astratta, deve per forza essere una classe completamente definita.

Dopodichè quella classe può essere anonima o no, dipende dalla convenienza e dalle necessità di design.

masteryuri
22-05-2012, 10:13
Sto pian piano capendo. :D
Allora chi chiamerà il metodo actionPerformed()?

PGI-Bis
22-05-2012, 13:40
Materialmente è il delegato UI del pulsante a pigliare la lista di action listener e a frullarla MA è solo un'implementazione: le api non stabiliscono chi deva farlo, dicono solo che quando quel metodo è invocato significa che il pulsante è stato "attivato" e noi possiamo ficcarci il codice che sarà eseguito come risposta.