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 :

Modifier variable dans une méthode


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2005
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 95
    Par défaut Modifier variable dans une méthode
    Bonjour,
    j'ai des variables dans une de mes méthodes, je passe ces variables a une autre méthode et j'aimerai que cette derniere me les modifie.
    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private void maMethode1(){
    int currentDate = -1;
    int boucle = -1;
    long begin = 0;
    long end = 0;
     
    // par exemple cette methode mes toutes mes variables a 5
    this.manageVariables(currentDate,boucle,begin,end);
    // et ici je peut faire 
    if(currentDate == 5)
     out.println("ok");
    }
    Je ne veut pas que mes variables soit globales a la classe, ni que ma méthodes me renvoie un tableau avec toutes les infos. Je souhaiterai que cela me modifie vraimenet les variables.
    Merci

  2. #2
    Membre expérimenté Avatar de g0up1l
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 341
    Par défaut
    La réponse est simple : ce n'est pas possible !

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2005
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 95
    Par défaut
    Citation Envoyé par g0up1l
    La réponse est simple : ce n'est pas possible !
    Sur?
    Car en c++ on peut la faire il me semble.....

    Bon tant pis pour moi !
    Merci

  4. #4
    Membre Expert
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Par défaut
    Java passe les paramètres en copiant la valeur donc (Code JDK5)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private void myMethod(int a) {
       a = 2;
    }
     
    ...
    int y = 1;
    System.out.println(y); //1
    myMethod(y);
    System.out.println(y); //1
    Mais dans le cas d'un objet c'est la valeur de la référence sur l'object qui est copié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private void myMethod(Integer a) {
       a = 1;
    }
     
    ...
    Integer y = 1;
    System.out.println(y); //1
    myMethod(y);
    System.out.println(y); //2
    Moralité passe des objets et non des primitives si tu veux en modifier la valeur dans une méthode.

  5. #5
    Membre expérimenté Avatar de g0up1l
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 341
    Par défaut
    Ouais, t'as tôt fait de créer un objet pour encapsuler tes quatre variables.

  6. #6
    Membre émérite Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Par défaut
    Tu peux mettre tes variables en variables de classe ce qui n'est pas bon du tout si tes variables ne servent qu'à ta méthode.

    Sinon tu peux faire un objet contenant tes variables (avec les getters et setters qui vont bien), auquel cas tu mets ta méthode manageVariables directement dans l'objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TonObjet to = new TonObjet(currentDate,boucle,begin,end);
    to.manageVariables();
    Ouais, t'as tôt fait de créer un objet pour encapsuler tes quatre variables.
    Exactement ça quoi...

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 392
    Par défaut
    Citation Envoyé par zekey
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private void myMethod(Integer a) {
       a = 1;
    }
     
    ...
    Integer y = 1;
    System.out.println(y); //1
    myMethod(y);
    System.out.println(y); //2
    je ne sais pas si tu as testé, mais ce que tu as écrit est FAUX!
    en effet, dans la méthode myMethod, tu modifies l'adresse mémoire de l'objet
    a, et tu n'auras pas en retour de la méthode l'adresse mémoire du nouvel objet, mais l'adresse mémoire de l'objet passé en paramètre (elle n'a pas changé), car en fait ton code devrait être écrit de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void myMethod(final Integer a) {
       a = new Integer(1);
    }
    et on voit bien le new qui change tout!

    Afin de se prémunir de ce genre de code, il faut mettre le mot clé "final" dans la définition des arguments de la méthode, ce qui interdit à la compilation ce genre de code qui peut prêter à confusion.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private void myMethod(final Integer a) {
       a = 1;
    }
    Les objets Integer, Float, Double... (dérivés des types primitifs) ne peuvent pas avoir leur valeur modifiée sans changer d'adresse mémoire (c'est pour ça qu'avec le jdk 1.5, on peut mélanger le type primitif (int) et l'Objet associé.
    Attention donc au jdk 1.5 qui induit un biais si on ne fait pas attention.

    Par contre, le code suivant va bien fonctionner :
    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
     
    public class Int {
    	private int i;
     
    	public int getI() {
    		return i;
    	}
     
    	public void setI(int i) {
    		this.i = i;
    	}
     
    	public Int(int _i) {
    		this.i = _i;
    	}
     
    	public String toString() {
    		return "" + this.i;
    	}
     
    }
     
    public class Toto {
    	public Toto() {
    	}
     
    	private void myMethod(Int a) {
    		a.setI(2);
    	}
     
    	public static void main(String[] args) {
    		Toto t = new Toto();
    		Int y = new Int(1);
    		System.out.println(y); // 1
    		t.myMethod(y);
    		System.out.println(y); // 2
    	}	
    }

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/03/2009, 12h21
  2. final dans les variables d'une méthode
    Par qdaemon_fr dans le forum Langage
    Réponses: 7
    Dernier message: 02/03/2009, 10h14
  3. Variable statique dans une méthode
    Par Djakisback dans le forum Langage
    Réponses: 4
    Dernier message: 10/01/2008, 17h51
  4. Initialiser des variables dans une méthode Statique
    Par ero-sennin dans le forum Langage
    Réponses: 10
    Dernier message: 07/12/2007, 15h26
  5. modifier le style dans une méthode
    Par flesblue dans le forum 4D
    Réponses: 1
    Dernier message: 07/09/2007, 11h22

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