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

    Visibilità in un blocco anonimo listener

    Salve, vorrei sapere i metodi esistenti per poter avere qualcosa visibile in un blocco anonimo che implementa un listener

    Al momento ne conosco 1 ma non mi piace tanto perchè finchè si parla di 1 oggetto va bene dichiarare un attributo, ma se sono 100, 1000 non so quanto sia corretto, mi sembra di tornare alle variabili globali eliminate da java.
    Dichiaro un oggetto, ad esempio un JButton come attributo di una classe

    Corretto:
    codice:
    private JButton bottone1 = new JButton("Bottone 1"); 
    
    public void mioMetodo(){
          JButton bottone2 = new JButton("Bottone 2");
            
    		bottone2.addActionListener(new ActionListener() {
    			public void actionPerformed (ActionEvent e){
                                     bottone1.setText("Ciao");
    			}
    
    		}
    	});
    }
    Scorretto:
    codice:
    public void mioMetodo(){
          JButton bottone1 = new JButton("Bottone 1"); 
          JButton bottone2 = new JButton("Bottone 2");
            
    		bottone2.addActionListener(new ActionListener() {
    			public void actionPerformed (ActionEvent e){
                                   bottone1.setText("Ciao");
    			}
    		}
    	});
    }
    Ci sono altri metodi? Grazie 1000

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: Visibilità in un blocco anonimo listener

    Originariamente inviato da mishima
    Scorretto:
    codice:
    public void mioMetodo(){
          JButton bottone1 = new JButton("Bottone 1"); 
          JButton bottone2 = new JButton("Bottone 2");
            
    		bottone2.addActionListener(new ActionListener() {
    			public void actionPerformed (ActionEvent e){
                                   bottone1.setText("Ciao");
    			}
    		}
    	});
    }
    Sarebbe corretto se bottone1 fosse dichiarato final.

    edit: ricontrolla anche le parentesi
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    si, le parentesi sono sbagliate, ho scritto quel pezzetto di codice in fretta


    final? mmm, ma non serve a dichiarare qualcosa che poi non potrà essere modificato o sbaglio?

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    502
    Originariamente inviato da mishima
    si, le parentesi sono sbagliate, ho scritto quel pezzetto di codice in fretta


    final? mmm, ma non serve a dichiarare qualcosa che poi non potrà essere modificato o sbaglio?
    il modificatore final indica solo che non puoi modificare l'oggetto, non quello che contiene.
    Esempio:
    codice:
    public static final String[]valori={"1","2","3","4"};
    
    valori[2]="tre"; // corretto
    valori={"tre"}; // non ammesso
    al volante son nervoso

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da mishima
    final? mmm, ma non serve a dichiarare qualcosa che poi non potrà essere modificato o sbaglio?
    Osserva la questione da questo punto di vista: l'oggetto che implementa ActionListener continua a "vivere" anche dopo che mioMetodo() è terminato! (supponendo ovviamente che bottone2 continui a sua volta a "vivere" magari perché l'hai assegnato ad una variabile di istanza e/o dentro un Container grafico).
    Ma quando mioMetodo() termina, le variabili bottone1/bottone2 comunque "spariscono". E quindi cosa "vedrebbe" il actionPerformed()??

    Per questo motivo si deve mettere bottone1 come 'final', per "congelarlo", renderlo una costante. La cosa sotto-sotto comunque è ancora più particolare. Il compilatore quando vede che la anonymous class referenzia una variabile final locale nel metodo in cui è dichiarata, se la "copia" in un campo di istanza della anonymous class. E il fatto che è marcata final garantisce tra l'altro che il valore non cambierà dal momento della inizializzazione fino al momento (che può essere anche molto tempo dopo) dell'uso.
    Se provassi a decompilare la classe, lo vedresti bene.

    Quindi, in definitiva, se una "anonymous" oppure una "local" inner-class vuole usare una variabile locale del metodo in cui è dichiarata, tale variabile deve essere final.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    come direbbe L'ispettore Catiponda: Ho capito tutto!

    Grazie a tutti

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.