Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    legame classi interne variabili final

    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?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: legame classi interne variabili final

    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?
    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.

    Un caso tipico, nel costruttore di una classe (ometto il resto, si suppone estenda JFrame):

    codice:
    public MyFrame() {
        final int val = 123;
    
        ....
    
        unPulsante.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println(val);
            }
        });
    }
    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().
    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.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    giusta osservazione! grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.