Non riesco a capire il legame tra classi interne e variabili final e perché il compilatore dà errori in certi casi. Qualcuno può chiarirmi le idee?
Non riesco a capire il legame tra classi interne e variabili final e perché il compilatore dà errori in certi casi. Qualcuno può chiarirmi le idee?
La questione delle variabili final si pone solo per i tipi di inner class che sono dichiarabili dentro un metodo/costruttore/blocco, ovvero le "anonymous" e le "local" inner class.Originariamente inviato da DarkSideMoon
Non riesco a capire il legame tra classi interne e variabili final e perché il compilatore dà errori in certi casi. Qualcuno può chiarirmi le idee?
Un caso tipico, nel costruttore di una classe (ometto il resto, si suppone estenda JFrame):
val deve essere final, altrimenti non è usabile all'interno della anonymous class. Il motivo per cui è richiesto questo è abbastanza semplice e razionale. Con new ActionListener() {....} si è istanziato un oggetto (di classe "anonima", da qui il nome del tipo di inner class) che viene passato a addActionListener().codice:public MyFrame() { final int val = 123; .... unPulsante.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println(val); } }); }
L'oggetto potenzialmente (dipende da cosa se ne fa) può continuare a "vivere" anche dopo che il costruttore MyFrame() è terminato. E nel caso della registrazione di un listener succede proprio questo.
Il pulsante (istanziato altrove, non l'ho mostrato) vivrà certamente anche dopo che il costruttore è terminato, così pure l'oggetto listener, perché tenuto referenziato dentro strutture dati all'interno del pulsante.
E qui siamo al punto cruciale: se il costruttore è terminato, una normale variabile locale sparisce, esce fuori dal suo scope. Se non c'è più, l'oggetto come farebbe ad usarla successivamente?
Il punto è che marcandola final la si "congela", la si fa diventare una "costante". Quindi la inner class può tranquillamente usarla.
Le cose sotto-sotto, a livello di codice generato, sono un po' più particolari. Ma non sto ora a dilungarmi.![]()
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
giusta osservazione! grazie
![]()