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

Collection et Stream Java Discussion :

arguments modifiés par la fonction


Sujet :

Collection et Stream Java

Vue hybride

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 726
    Par défaut arguments modifiés par la fonction
    Est-il possible en java que les variables qui sont passées en paramètre à une fonction conservent leur nouvelle valeur après l'éxécution de la fonction:

    par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    maFonction(int var){
      var = 1;
    }
     
    main{
      var1 = 0;
      maFonction(var1);
      //je veux que var1 ait pour valeur 1 
    }
    merci

  2. #2
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Non, en Java les types simples sont passés par copie, et les objets sont passés par référence (le paramètre formel de la méthode prend la valeur de la référence).
    Dans ton cas tu peux passer par une classe Wrapper :
    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
    maFonction(WrapperInt var){
      var.i = 1;
    }
     
    main{
      WrapperInt var1 = new WrapperInt(0);
      maFonction(var1);
      //je veux que var1 ait pour valeur 1 
    }
     
    class Wrapper {
      public i;
      public Wrapper(int i) {
        this.i = i;
      }
    }

  3. #3
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    heu j'ai loupé qqch avec les dernières versions de java où bien un simple Integer (objet, différent du type primitif 'int') suffit ?

  4. #4
    Membre éprouvé
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Par défaut
    Citation Envoyé par iohack Voir le message
    heu j'ai loupé qqch avec les dernières versions de java où bien un simple Integer (objet, différent du type primitif 'int') suffit ?
    Non, Ca ne marche pas avec les Integer car la classe Integer est immuable (ainsi que toutes les classes wrappers standards d'ailleurs.)

    Il faut donc bien utiliser un wrapper personnalisé.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    726
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 726
    Par défaut
    Citation Envoyé par herve91 Voir le message
    les objets sont passés par référence (le paramètre formel de la méthode prend la valeur de la référence).
    C'est ce cas là qui m'interesse surtout.
    Si je passe en paramètre un objet à une fonction et qu'elle le modifie, au sortir de la fonction j'aurai le même objet qu'avant l'appel de la fonction, non?

    merci

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Par défaut
    Non justement, Java utilisant les références, si tu modifies un Object dans une méthode, celui-ci est modifié même après la sortie de cette méthode.

    Mais comme dit plus haut, ceci ne s'applique pas aux Objects "standards" comme String par exemple qui gardera sa valeur :/ Par contre une classe Personne avec une propriété nom (String) sera bien changé (d'où l'exemple du Wrapper)

  7. #7
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    D'où l'importance de bien documenter les méthodes. Il est possible qu'une méthode modifie ses paramètres (inout/out) ou pas (in).
    C'est aussi le cas pour les accesseurs (inspecteurs) : doit-on renvoyer une copie ou la référence elle-même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MyObj getMyObj() {
       return obj;
       // ou : return obj.clone();
    }
    Le problème immuabilité en Java est un combat de tous les instants (ou presque).

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    726
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 726
    Par défaut Cas des ArrayList
    J'ai fait des tests avec les ArrayList:
    quand je fais par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    ArrayList al = new ArrayList();
    Objet o1, o2;
     
    al.add(o1);
     
    o2 = al.get(0);
    o2.modif() //fonction qio modifie l'objet o2
     
    //o1 n'est pas modifié, pourtant c'est la même référence non?

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 30/03/2013, 18h41
  2. Modifier une zone de texte désigné par la fonction eval(concat de variables)
    Par Franck2mars dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 19/07/2006, 11h43
  3. Réponses: 10
    Dernier message: 24/02/2004, 12h28
  4. [LG]résultat renvoyé par une fonction
    Par le 27 dans le forum Langage
    Réponses: 3
    Dernier message: 10/12/2003, 10h31
  5. tableau javascript ecrit par une fonction asp
    Par LineLe dans le forum ASP
    Réponses: 4
    Dernier message: 03/11/2003, 08h38

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