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 :

Passage en paramètre : perte de référence


Sujet :

Langage Java

Vue hybride

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Par défaut Passage en paramètre : perte de référence
    Bonjour,

    J'ai un soucis de perte de référence avec un JComponent. J'ai créé une méthode de recherche récursive d'un JComponent dans un parent à partir de son nom. La voici :

    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
    private void getComponent(String compName, JComponent parent, JComponent retComp) {
    	System.out.println("Entering : " + parent.getClass().toString() + " " + (retComp != null ? retComp : "null"));
    	if (parent instanceof JPanel) {
    		for (Component child : parent.getComponents()) {
    			String name = child.getName() == null ? "" : child.getName();
    			if (name.equalsIgnoreCase(compName)) {
    				retComp = (JComponent)child;
    				break;
    			}
    			else {
    				getComponent(compName, (JComponent)child, retComp);
    			}
    		}
    	}		
    	System.out.println("Exiting : " + parent.getClass().toString() + " " + (retComp != null ? retComp : "null"));
    }
    Dans les traces, je vois bien mon composant trouvé mais il vaut null à l'extérieur de la méthode :

    10:12:02.514 AWT-EventQueue-0 Entering : class javax.swing.JPanel null
    10:12:02.515 AWT-EventQueue-0 Entering : class javax.swing.JLabel null
    10:12:02.515 AWT-EventQueue-0 Exiting : class javax.swing.JLabel null
    10:12:02.515 AWT-EventQueue-0 Entering : class javax.swing.JPanel null
    10:12:02.515 Last Message repeated 1 times
    10:12:02.515 AWT-EventQueue-0 Entering : class javax.swing.JLabel null
    10:12:02.515 AWT-EventQueue-0 Exiting : class javax.swing.JLabel null
    10:12:02.515 AWT-EventQueue-0 Entering : class javax.swing.JPanel null
    10:12:02.516 AWT-EventQueue-0 Entering : class javax.swing.JButton null
    10:12:02.516 AWT-EventQueue-0 Exiting : class javax.swing.JButton null
    10:12:02.516 AWT-EventQueue-0 Exiting : class javax.swing.JPanel null
    10:12:02.516 AWT-EventQueue-0 Entering : class javax.swing.JLabel null
    10:12:02.516 AWT-EventQueue-0 Exiting : class javax.swing.JLabel null
    10:12:02.516 AWT-EventQueue-0 Entering : class luxor.swing.input.XLabel$1 null
    10:12:02.516 AWT-EventQueue-0 Exiting : class luxor.swing.input.XLabel$1 null
    10:12:02.517 AWT-EventQueue-0 Entering : class javax.swing.JLabel null
    10:12:02.517 AWT-EventQueue-0 Exiting : class javax.swing.JLabel null
    10:12:02.517 AWT-EventQueue-0 Entering : class javax.swing.JPanel null
    10:12:02.517 AWT-EventQueue-0 Entering : class javax.swing.JButton null
    10:12:02.517 AWT-EventQueue-0 Exiting : class javax.swing.JButton null
    10:12:02.517 AWT-EventQueue-0 Exiting : class javax.swing.JPanel null
    10:12:02.517 AWT-EventQueue-0 Entering : class javax.swing.JLabel null
    10:12:02.518 AWT-EventQueue-0 Exiting : class javax.swing.JLabel null
    10:12:02.518 AWT-EventQueue-0 Exiting : class javax.swing.JPanel null
    10:12:02.518 Last Message repeated 1 times
    10:12:02.518 AWT-EventQueue-0 Entering : class javax.swing.JLabel null
    10:12:02.518 AWT-EventQueue-0 Exiting : class javax.swing.JLabel null
    10:12:02.518 AWT-EventQueue-0 Entering : class javax.swing.JPanel null
    10:12:02.518 AWT-EventQueue-0 Entering : class javax.swing.JLabel null
    10:12:02.518 AWT-EventQueue-0 Exiting : class javax.swing.JLabel null
    10:12:02.519 AWT-EventQueue-0 Entering : class javax.swing.JPanel null
    10:12:02.519 Last Message repeated 2 times
    10:12:02.519 AWT-EventQueue-0 Entering : class javax.swing.JComboBox null
    10:12:02.519 AWT-EventQueue-0 Exiting : class javax.swing.JComboBox null
    10:12:02.519 AWT-EventQueue-0 Exiting : class javax.swing.JPanel null
    10:12:02.519 Last Message repeated 1 times
    10:12:02.519 AWT-EventQueue-0 Entering : class javax.swing.JLabel null
    10:12:02.519 AWT-EventQueue-0 Exiting : class javax.swing.JLabel null
    10:12:02.520 AWT-EventQueue-0 Entering : class javax.swing.JPanel null
    10:12:02.520 AWT-EventQueue-0 Entering : class javax.swing.JLabel null
    10:12:02.520 AWT-EventQueue-0 Exiting : class javax.swing.JLabel null
    10:12:02.520 AWT-EventQueue-0 Entering : class javax.swing.JPanel null
    10:12:02.520 AWT-EventQueue-0 Entering : class javax.swing.JButton null
    10:12:02.520 AWT-EventQueue-0 Exiting : class javax.swing.JButton null
    10:12:02.520 AWT-EventQueue-0 Exiting : class javax.swing.JPanel null
    10:12:02.520 AWT-EventQueue-0 Entering : class javax.swing.JLabel null
    10:12:02.521 AWT-EventQueue-0 Exiting : class javax.swing.JLabel null
    10:12:02.521 AWT-EventQueue-0 Entering : class javax.swing.JPanel null
    10:12:02.521 AWT-EventQueue-0 Entering : class javax.swing.JButton null
    10:12:02.521 AWT-EventQueue-0 Exiting : class javax.swing.JButton null
    10:12:02.521 AWT-EventQueue-0 Exiting : class javax.swing.JPanel null
    10:12:02.521 AWT-EventQueue-0 Entering : class javax.swing.JLabel null
    10:12:02.521 AWT-EventQueue-0 Exiting : class javax.swing.JLabel null
    10:12:02.521 AWT-EventQueue-0 Entering : class javax.swing.JPanel null
    10:12:02.522 AWT-EventQueue-0 Entering : class javax.swing.JButton null
    10:12:02.522 AWT-EventQueue-0 Exiting : class javax.swing.JButton null
    10:12:02.522 AWT-EventQueue-0 Exiting : class javax.swing.JPanel null
    10:12:02.522 AWT-EventQueue-0 Entering : class javax.swing.JLabel null
    10:12:02.522 AWT-EventQueue-0 Exiting : class javax.swing.JLabel null
    10:12:02.522 AWT-EventQueue-0 Exiting : class javax.swing.JPanel null
    10:12:02.522 Last Message repeated 1 times
    10:12:02.522 AWT-EventQueue-0 Entering : class javax.swing.JLabel null
    10:12:02.523 AWT-EventQueue-0 Exiting : class javax.swing.JLabel null
    10:12:02.523 AWT-EventQueue-0 Entering : class javax.swing.JPanel null
    10:12:02.523 Last Message repeated 1 times
    10:12:02.523 AWT-EventQueue-0 Entering : class javax.swing.JLabel null
    10:12:02.523 AWT-EventQueue-0 Exiting : class javax.swing.JLabel null
    10:12:02.523 AWT-EventQueue-0 Entering : class javax.swing.JPanel null
    10:12:02.523 AWT-EventQueue-0 Entering : class javax.swing.JLabel null
    10:12:02.523 AWT-EventQueue-0 Exiting : class javax.swing.JLabel null
    10:12:02.524 AWT-EventQueue-0 Entering : class javax.swing.JButton null
    10:12:02.524 AWT-EventQueue-0 Exiting : class javax.swing.JButton null
    10:12:02.524 AWT-EventQueue-0 Exiting : class javax.swing.JPanel null
    10:12:02.524 AWT-EventQueue-0 Entering : class javax.swing.JLabel null
    10:12:02.524 AWT-EventQueue-0 Exiting : class javax.swing.JLabel null
    10:12:02.524 AWT-EventQueue-0 Exiting : class javax.swing.JPanel null
    10:12:02.524 Last Message repeated 1 times
    10:12:02.524 AWT-EventQueue-0 Entering : class javax.swing.JLabel null
    10:12:02.525 AWT-EventQueue-0 Exiting : class javax.swing.JLabel null
    10:12:02.525 AWT-EventQueue-0 Exiting : class javax.swing.JPanel null
    10:12:02.525 AWT-EventQueue-0 Entering : class javax.swing.JLabel null
    10:12:02.525 AWT-EventQueue-0 Exiting : class javax.swing.JLabel null
    10:12:02.525 AWT-EventQueue-0 Exiting : class javax.swing.JPanel javax.swing.JPanel[sectorsBox,0,0,-1x-1,invalid,layout=javax.swing.BoxLayout,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.synth.SynthBorder@b55e35a,flags=9,maximumSize=java.awt.Dimension[width=2147483647,height=1073741823],minimumSize=java.awt.Dimension[width=144,height=140],preferredSize=java.awt.Dimension[width=515,height=450]]
    Qu'est-ce qui m'échappe ?

  2. #2
    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,


    Une valeur de retour se passe en retour de la méthode, et non pas en paramètre.

    Je rappelle qu'en Java le passage par référence n'existe pas : on passe tout par copie !!!

    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
    	private JComponent getComponent(String compName, JComponent parent) {
    		System.out.println("Entering : " + parent.getClass().toString());
    		if (parent instanceof JPanel) {
    			for (Component child : parent.getComponents()) {
    				String name = child.getName() == null ? "" : child.getName();
    				if (name.equalsIgnoreCase(compName)) {
    					return (JComponent)child;
    				}
    				JComponent componentFound = getComponent(compName, (JComponent)child);
    				if (componentFound != null) {
    					return componentFound;
    				}
    			}
    		}
    		return null;
    	}

    a++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Par défaut
    Ok, merci pour la correction de la méthode.

    Pour m'éclairer un peu mieux, pourrais-tu m'expliquer exactement ce que fait cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    		...
    		StringBuffer buf = new StringBuffer("value");
    		changeString(buf);
    		changeString(buf);
    		System.out.println(buf.toString());
    	}
     
    	public void changeString(StringBuffer str) {
    		str.append("!");
    	}
    Dans la logique de la copie, la chaine ne devrait pas être modifiée. Pourtant c'est le cas. Que se passe t-il ?

  4. #4
    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
    Dans ce code tu ne chances pas la référence de l'objet, mais tu modifies son état via l'appel d'une méthode.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    arg.uneMethode(); // Appel d'une méthode sur l'objet,
    // qui modifie éventuellement son état.
     
    arg = new Object(); // affectation d'une nouvelle référence
    // On perd tout lien avec l'objet précédemment référencé

    En fait la distinction vient du fait que l'on copie des références. Donc lorsqu'on passe un objet en paramètre on peut le modifier si celui-ci est muable.

    Par contre on ne peut pas faire d'affectation et espérer avoir une valeur de retour. D'ailleurs en règles général il vaut mieux éviter cela. Certains conseille d'utiliser final sur tous les paramètres d'une méthode (d'autres estime que cela devrait être le cas par défaut).


    a++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Par défaut
    Merci pour l'explication, c'est clair maintenant

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 09/08/2007, 17h34
  2. Passage de paramètres par référence
    Par margagn dans le forum Framework .NET
    Réponses: 2
    Dernier message: 08/05/2007, 23h08
  3. [POO] Passage de paramètre par référence.
    Par abidi_niz dans le forum Langage
    Réponses: 3
    Dernier message: 12/10/2006, 12h20
  4. [C#] passage de paramètres par référence
    Par SesechXP dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/08/2006, 12h48
  5. [EJB] Passage des paramètres par référence
    Par salome dans le forum Java EE
    Réponses: 2
    Dernier message: 05/07/2005, 11h25

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