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 de paramètres en out


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 23
    Par défaut Passage de paramètres en out
    Salut,
    je ne me rappelle plus trop de ce langage, j'ai une question sur mon code que je vais ici simplifier à l'extrême pour pas tout vous copier coller :

    méthode principale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    {
    String a = "ok";
    String b = "ok2";
    change(a,b);
    // ici quelles sont les valeurs de a et b ? "ok" ou "changé" ?
    }
    et la méthode change :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void change(String a, String b) {
     a= "changé";
     b="changé2";
    }
    Est-ce que avec cette méthode en void ça va me changer les valeurs des string dans la méthode où a lieu l'appel ?
    Si oui, ok.
    Si non, comment faire pour récupérer ces 2 modifs avec l'appel de la méthode ?

    Merci à vous

  2. #2
    Membre émérite Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    Par défaut
    salut,

    tes objets String seront modifiés, puisque java ne travaille qu'avec des références, et donc ce sont les références de tes String qui sont passés comme arguments à la méthode change(...), et seront directement modifiés.
    mais tu aurais pu simplement faire un System.out.println(a + ", " + b) pour tester !!

  3. #3
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 23
    Par défaut
    ok merci !

    sinon par curiosité, si je veux passer un paramètre String comme ça, mais que je ne veux pas qu'il soit modifié dans la méthode appelante (alors qu'il y a une modif dans la méthode appelée) je fais comment ? (càd que a ou b gardent leurs valeurs "ok" et "ok2" après l'appel). A part une copie ds une string différente avant l'appel il existe qlqch d'autre ?

    Ps : il m'était plus simple de demander sur un forum que de faire un println car je suis sur un projet énorme et ma partie ne se lance qu'en cas d'exceptions rares... et je ne sais pas la déclencher pour l'instant car j'arrive à peine sur ce projet enfin bref.

  4. #4
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 23
    Par défaut
    ah mince javais pas vu les 2 autres réponses.
    comment faire alors ? pour qu'elles changent ?

  5. #5
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Par défaut
    Tu ne peux pas les faire changer, en effet String est un objet immuable.

    Il faut soit que la méthode retourne les infos qui t'intéressent
    ou plutot utiliser des StringBuilder.

  6. #6
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 23
    Par défaut
    ah ... dommage ça

    je fais comment du coup ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public String[] change(String a, String b) {
    a= "changé";
    b="changé2";
     
    String[] st;
    st[0] = a;
    st[1] = b;
     
    return st;
    }
    et dans la méthode appelante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String[] result = change(a,b);
    a = result[0];
    b = result[1];
    ça marche ça ?

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 64
    Par défaut
    ou déclare ta methode et tes String en instance de classe (static) pour que les valeurs soient changées.

  8. #8
    Membre émérite Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    Par défaut

    j'avais oublié que les String étaient immuables

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 73
    Par défaut
    Bonjour,

    Je suis pas d'accord Herch, au contraire, les valeurs restent inchangées, tu auras donc a = "ok" et b = "ok2"

  10. #10
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Par défaut
    Tes valeurs n'auront pas changé. Les valeurs de a et b resteront "ok et "ok2".

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    hmmm l'histoire du passage de paramètres n'a pas grand chose à voir avec le fait que les String soient immuables... c'est plutôt dû au passage des objets en paramètre de façon générale...

    J'ai trouvé un lien ici qui explique le passage de paramètres.

    Dans la fonction change, tu déclares une variable locale a[*], qui contient une référence vers l'objet String passé en paramètre.
    Lorsque tu effectues a="changé" tu crées un nouvel objet String et tu affectes à la variable locale a la référence vers ce nouvel objet, mais tu ne modifies pas l'objet passé en paramètre.
    Si la classe String présentait une méthode modifiant l'état interne de l'instance à laquelle elle est appliqué [**], tu aurais effectivement pu modifier "par référence" les objets passés en paramètre, comme dans l'exemple suivant :
    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
    static class TestClass {
    	private int test;
     
    	public TestClass(int test) {
    		this.test = test;
    	}
     
    	public void setTest(int test) {
    		this.test = test;
    	}
     
    	public int getTest() {
    		return test;
    	}
     
    	public String toString() {
    		return String.valueOf(test);
    	}
     
    }
     
    public static void reset1(TestClass a) {
    	a = new TestClass(0);
    }
     
    public static void reset2(TestClass a) {
    	a.setTest(0);
    }
     
    public static void main(String[] args) {
    	TestClass a = new TestClass(1);
    	TestClass b = new TestClass(1);
     
    	System.out.println(a);
    	System.out.println(b);
     
    	reset1(a);
    	reset2(b);
     
    	System.out.println(a);
    	System.out.println(b);
    }
    Résultat :

    Et donc pour répondre au problème : pour pouvoir modifier dans une méthode les objets passés en paramètres, il faudrait que ces objets présentent les méthodes permettant de modifier leur état... ce qui n'est pas le cas des String.
    Il faut donc trouver une autre méthode, plusieurs ont déjà été proposées, celle qui s'approche le plus de ce que tu voulais faire au départ serait d'utiliser des StringBuilder/StringBuffer tant que tu es susceptible d'y appliquer des modifications et de les transformer en String au dernier moment seulement.
    Si tu expliquais de façon plus générale ce que tu cherches à faire, on pourrait peut-être t'aider à trouver une meilleure solution


    [*] ça marche aussi pour b bien sûr
    [**]en fait une telle méthode n'existe pas, c'est là qu'il devient pertinent de dire que les String sont immuables mais voyez l'exemple, avec des objets quelconques, c'est pareil !

  12. #12
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Par défaut
    Citation Envoyé par Astartee Voir le message

    [*] ça marche aussi pour b bien sûr
    [**]en fait une telle méthode n'existe pas, c'est là qu'il devient pertinent de dire que les String sont immuables mais voyez l'exemple, avec des objets quelconques, c'est pareil !
    Oui, 100% d'accord, mais le fait que l'on n'est aucune méthode disponible pour effectuer des modifications sur String et que l'on soit obligé de changer la référence est bien du au fait que String soit immuable.

    Citation Envoyé par Astartee Voir le message
    Si la classe String présentait une méthode modifiant l'état interne de l'instance à laquelle elle est appliqué [**], tu aurais effectivement pu modifier "par référence" les objets passés en paramètre, comme dans l'exemple suivant :
    Oui, mais dans ce cas String ne serait plus immuable.

    Du coup, aucune méthode ne permet de changer l'état interne parce que String est un objet immuable. Si elle ne l'était pas on aurait pu.

    Je me trompe?

  13. #13
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Citation Envoyé par eric39 Voir le message
    Je me trompe?
    Nan, c'est bien ça, et c'est très exactement ce que j'ai dit dans ma deuxième note ([**])

    EDIT
    Explication de ma phrase "l'histoire du passage de paramètres n'a pas grand chose à voir avec le fait que les String soient immuables" :
    Après que herch a été corrigé sur la première question (est-ce que les variables passées en paramètres sont modifiées après l'appel de la fonction change ?), il a dit "j'avais oublié que les String étaient immuables", ce qui donne l'impression que c'est cette immuabilité qui entraîne l'absence de modification, ce qui est faux puisque c'est valable pour n'importe quel objet (cf. mon petit exemple).
    Le fait qu'on ne puisse pas effectuer avec des String ce que voulait faire MuLog est par contre bien dû à l'immuabilité des String, puisqu'avec un autre type d'objet (qui propose des méthodes modifiant l'instance elle-même...) ça peut marcher.
    (gargl, je m'embrouille, je suis de moins en moins claire en fait )

  14. #14
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Par défaut
    Citation Envoyé par Astartee Voir le message
    Nan, c'est bien ça, et c'est très exactement ce que j'ai dit dans ma deuxième note ([**])
    OK, j'avais du coup, eu un doute sur le principe d'objet immuable...

  15. #15
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 23
    Par défaut
    Un grand merci à vous tous pour votre réactivité

    Sujet résolu (enfin j'espère... lol car je ne peux pas tester sans mon supérieur qui sait comment générer l'exception qui appelle ce bout de code, mais aucune erreur ne ressort sur Eclipse... c'est déjà ça !)

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

Discussions similaires

  1. [Forms]Passage de paramètre entre Forms et Reports
    Par jack554 dans le forum Reports
    Réponses: 4
    Dernier message: 30/03/2004, 13h58
  2. probleme lors du passage de paramètre
    Par maxmj dans le forum ASP
    Réponses: 4
    Dernier message: 18/11/2003, 00h15
  3. [XSL] Passage de paramètres à un template
    Par pantin dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 27/06/2003, 13h28
  4. passage de paramètres
    Par pram dans le forum XMLRAD
    Réponses: 5
    Dernier message: 18/02/2003, 17h28
  5. passage en paramètre d'un array dynamique 2D
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 27/11/2002, 19h47

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