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

Langage Java Discussion :

Variable : inner class


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 138
    Par défaut Variable : inner class
    Bonjour,

    J'aimerai savoir comment transmettre facilement les variables créées dans une classe externe vers une classe interne.

    Voici le code en question :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    Class principale{
    ...
    ...
    ...
       {
       Bateau torpilleuradv = new Bateau(r, 2);
          btn.addActionListener(new ActionListener(){
             public void actionPerformed(ActionEvent e){
                torpilleuradv.afficheBateau(); // Le problème est ici.
             }
          }
       }
    ...
    ...
    ...
    }
     
    //------------------------------//
     
    Class Bateau{
     
       public Bateau(){
          ...
       }
     
       public static void afficheBateau(){
          ...
       }
     
    }
    Message d'erreur : Cannot refer to a non-final variable torpilleuradv inside an inner class defined in a different method

    Mettre final Bateau torpilleuradv = ... n'est pas la solution, même si cela fonctionne partiellement.

    Donc je suis entrain de me documenter sur internet (merci google), mais j'avoue que ca commence à être long, d'où ce poste.

    Si quelqu'un pouvait alléger le temps de mes recherches, j'en serai infiniment reconnaissant.

    Cordialement,

    Jean

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Par défaut
    Bonjour,
    Quelqu'un d'autre t'expliqueras mieux que moi ce que veut dire ce message, mais ma solution serait d'extraire ta classe annonyme :

    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
    Class principale{
       {
       Bateau torpilleuradv = new Bateau(r, 2);
          btn.addActionListener(new MonActionListener(torpilleuradv));
       }
      private class MonActionListener implements ActionListener{
        Bateau unBateau;
        protected MonActionListener(Bateau leBateau){
          unBateau = leBateau;
        }
        public void actionPerformed(ActionEvent e){
          this.unBateau.afficheBateau();
        }
      }
    }
    J'utilise ce système lorsque je risque d'avoir besoin d'autres écouteurs ou comportements.

  3. #3
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Citation Envoyé par Evilam Voir le message
    Mettre final Bateau torpilleuradv = ... n'est pas la solution, même si cela fonctionne partiellement.
    Pourquoi n'est-ce pas la solution ? Pourquoi est-ce que ça fonctionne partiellement ?
    Selon moi c'est la bonne solution pourtant.

  4. #4
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 690
    Par défaut
    Mettre final Bateau torpilleuradv = ... n'est pas la solution, même si cela fonctionne partiellement.
    Pourquoi tu as besoin de pouvoir affecter un autre objet à torpilleuradv? Si ce n'est pas le cas, c'est une bonne solution.
    La proposition de JohnNC est aussi une bonne solution.

    Une solution sale(mais qui marche également) serait de passer par une variable de la classe principale.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 138
    Par défaut
    Alors, tout d'abord merci pour vos réponse que je vais tester dans l'après midi, après avoir effectué mon petit travail quotidien dans l'entreprise familiale ^^.

    @Natha @Uther :

    Utilisez Final n'est pas la bonne solution car lors de la création de l'objet Bateau, cette méthode efface/écrase toutes les autres affectations aux éléments de ce type.
    Pour être plus clair :

    Final Bateau test1 = new Bateau(2,3);
    Final Bateau test2 = new Bateau(2,5);

    Si les cases que contient le bateau test1 sont 2,3 et 4 et que celles de test2 sont 5,6,7,8 et 9 alors, quand j'ai testé ceci, je me suis retrouvé avec (à l'affichage) :
    Bateau 1 : cases (5)(6)
    Bateau 2 : cases (5)(6)(7)(8)(9)

    D'où mon désintéret d'utiliser final.

    @JohnNC :

    T'as solution est celle que j'avais cru voir dans les cours sur les inner class, donc je pense qu'elle sera bonne. Je mettrai ce soir un autre message si les soucis persistent, ou un petit "Résolu".

    Encore merci pour vos réponse.

    Cordialement,

    Jean

  6. #6
    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 Evilam Voir le message
    D'où mon désintéret d'utiliser final.
    Je ne comprend pas ton problème et ton histoire de "cases" !

    Le mot clef final empêche seulement de réaffecter la référence... et ne la modifie en aucun cas...


    Citation Envoyé par Evilam Voir le message
    T'as solution est celle que j'avais cru voir dans les cours sur les inner class, donc je pense qu'elle sera bonne. Je mettrai ce soir un autre message si les soucis persistent, ou un petit "Résolu".
    Et l'utilisation d'une variable final dans une classe interne revient strictement au même, sauf que c'est le compilateur qui se chargera de transmettre la référence via le constructeur...

    a++

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 138
    Par défaut
    @adiGuba : Merci pour ta réponse qui m'a fait refaire des tests qui je l'espérai prouverai que tu as faux, mais qui finalement montrent que c'était moi qui avait faux depuis un sacré bout de temps.^^

    En effet, le problème doit venir d'autre part.

    Je pensais que ca venait de final, mais je me rend compte que je n'arrive tout simplement pas à récupérer les bonnes informations quand je regarde chaque éléments qui composent le tableau de point que forme un bateau...

    Je retourne à mon problème initial que j'avais réglé je ne sais comment et qui est donc réapparu je ne sais comment aussi...

    Je vais garder ce topic ouvert jusqu'à ce que j'en ai fini avec mes questions (idiotes certes) mais qui me font avancer un peu plus vite.

    Si quelqu'un à une idée sur l'erreur qu'il y a, qu'il ne se prive pas de me le dire ^^"

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    class Point{
     
    	public static Point p;
    	public static int i;
     
    	public Point(){
    		i=0;
    	}
     
    	public Point(int i){
    		this.i=i;
    	}
     
    	public int getPoint() {
    		return i;
    	}
     
    	public void setPoint(int i) {
    		i = i;
    	}
     
    	public String toString()
    	{
    	    return getPoint()+"";
    	}
     
    }
     
    class Bateau{
     
    	public static int taille;
    	public static Point[] bat;
     
     
    	public Bateau(){
    		 taille = 0; // Par défaut il a une taille 0
    		 bat= new Point[taille];
    		 }
     
    	// Constructeur de Bateau aléatoirement généré d'une certaine taille entrée en parametre
    	 public Bateau(int c, int taille){
     
    			 bat = new Point[taille];
    			 for(int j = 0; j<bat.length; j++){
    				 int res = c+j;
    				 bat[j] = new Point(res);
     
    			 }
    			 for(int j = 0; j<bat.length; j++){
    				 System.out.println("Création bateau :"+bat[j]);
    			 }
    	 }
     
    	public void afficheBateau(){
     
    		for(int j=0; j<bat.length; j++){
    			System.out.println("Affichage de la case "+j+" du bateau : "+bat[j]);
    		}
    	 }
     
    	public Point getPoint(int i){
     
    		return bat[i];
     
    	}
     
    	public void setBateau(int i, Point t){
     
    		this.bat[i]=t;
     
    	}
     
    	public boolean estDansBat(Point p){
     
    		int i;
    		for(i=0;i<bat.length;i++){
    			if(p.getPoint()==bat[i].getPoint()){
    				return true;
    			}
     
     
    		}
    		return false;
    	}
     
    }

    Résultat du code ci-dessus :

    Case15
    Création bateau :16
    Création bateau :16
    Information sur torpilleur
    Affichage de la case 0 du bateau : 16
    Affichage de la case 1 du bateau : 16

    Cordialement,

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/03/2009, 10h44
  2. Réponses: 1
    Dernier message: 18/06/2008, 10h09
  3. débutant:utilisation de variable entre classe
    Par troojan dans le forum MFC
    Réponses: 1
    Dernier message: 07/12/2005, 23h31
  4. Réponses: 6
    Dernier message: 23/09/2005, 12h54
  5. Es ce possible de faire des inner class en C++?
    Par Eithelgul dans le forum C++
    Réponses: 5
    Dernier message: 14/02/2005, 14h27

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