IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

variable dans ActionListener déclarer en final


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de LeXo
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 147
    Par défaut variable dans ActionListener déclarer en final
    Bonjour

    voila je débute en java

    et je fais une sorte de tableau
    avec une classe perso FileToCopy

    le tableau est donc composé d'objet de la classe FileTopCopy
    et a chaque objet je lui mets un bouton qui va aller chercher un fichier avec un JFileChooser

    pour instancier un tel bouton, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public JButton getButtonDetect(String name,FileToCopy fichier){
            JButton btDetect;
            btDetect = new JButton(name);
            btDetect.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    fichier.setPath();
                }
     
            }
            );
     
            return btDetect;
     
        }
    si j'ai bien compris fichier doit etre déclaré final ??
    pourquoi ??

    d'avance merci
    D:\Projet\Java\KTool\src\ihm\component\ArrayFileCopy.java:71: local variable fichier is accessed from within inner class; needs to be declared final

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    Tu déclare ton ActionListener en utilisant une classe anonyme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    new ActionListener(){
      public void actionPerformed(ActionEvent e){
        fichier.setPath();
      }
    Les variables utilisées par ces classes doivent être final

  3. #3
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Cependant, moi je n'ai jamais compris pourquoi. Si quelqu'un avait des explications autre que C'est comme ça...

  4. #4
    Membre expérimenté
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Par défaut
    Citation Envoyé par gifffftane Voir le message
    Cependant, moi je n'ai jamais compris pourquoi. Si quelqu'un avait des explications autre que C'est comme ça...
    l utilisation des variables d une methode dans une inner class doivent etre declare final.
    parceque les variable declare dans une methodes vivent dans le stack le probleme c est quand lorsque la methode se termine ces varaibles seront detruites, mais qu est ce qui se passent si ces variables sont detruites et que ton inner class est toujours en vie dans le Heap et sachant qu elle utilise une de ces vraiables??

    j espere que c est clair. pour plus d info consulter le chapitre 8 Inner Class de Sun certified Java Programer 5 study guide.

    Personnelement je trouve ce livre en genral est complet specialement si vous voulez passer la SCJP 1.5.

    Cheers,

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par gifffftane Voir le message
    Cependant, moi je n'ai jamais compris pourquoi. Si quelqu'un avait des explications autre que C'est comme ça...
    C'est juste pour éviter toute ambigüité...

    Le mot-clef final permet d'interdire toute nouvelle affectation de la variable et ainsi de garantir qu'elle "pointera" toujours vers le même objet. Ainsi il n'y a pas de doute sur l'objet qui sera manipulé dans la classe anonyme.


    En effet, si plus loin dans le code tu fais quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichier = new FileToCopy( ... );
    Alors il peut y avoir une ambigüité pour le développeur : la référence "fichier" dans la classe anonyme pointe-t-elle vers la première valeur ou bien vers cette nouvelle valeur ? Ce n'est pas évident à déterminer surtout que le code de la classe anonyme n'est pas forcément exécuté lors de sa déclaration (et en particulier pour un ActionListener).

    Bref en obligeant le final on est sûr de ne manipuler qu'une seule référence et il n'y a plus cette ambigüité !

    a++

  6. #6
    Membre expérimenté
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Bref en obligeant le final on est sûr de ne manipuler qu'une seule référence et il n'y a plus cette ambigüité !
    je me permet d ajouter, de ne pas perde la referance a cet objet aussi et le keep it life...

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jhaythem Voir le message
    je me permet d ajouter, de ne pas perde la referance a cet objet aussi et le keep it life...
    La référence est passé à la classe anonyme via un constructeur implicite "coder" par le compilateur et conserver dans un attribut d'instance...

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    		final Date date = new Date();
    		ActionListener al = new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				System.out.println(date);
    			}
    		};
     
     
    		System.out.println("Constructeur : ");
    		for (Constructor c : al.getClass().getDeclaredConstructors() ) {
    			System.out.println("\t"+c);
    		}
    		System.out.println("Attribut d'instance : ");
    		for (Field f : al.getClass().getDeclaredFields() ) {
    			System.out.println("\t"+f);
    		}
    Ce qui affiche :
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Constructeur : 
    	main.Main$1(java.util.Date)
    Attribut d'instance : 
    	private final java.util.Date main.Main$1.val$date
    (où "main.Main" correspond à ma classe de test)

    a++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Debutant]Comment déclarer des variables dans un fichier a part
    Par megapacman dans le forum Général Java
    Réponses: 14
    Dernier message: 14/01/2008, 13h32
  2. déclarer une variable dans tout un module
    Par Swiper dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 02/07/2007, 09h06
  3. Déclarer une variable dans un PIC
    Par Vinch006 dans le forum C
    Réponses: 5
    Dernier message: 09/03/2007, 17h49
  4. Réponses: 4
    Dernier message: 20/04/2006, 02h56
  5. [AS2] déclarer des variables dans une fonction
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 12
    Dernier message: 02/08/2005, 12h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo