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

Java Discussion :

Modifier un paramètre muable dans une fonction


Sujet :

Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Points : 97
    Points
    97
    Par défaut Modifier un paramètre muable dans une fonction
    Bonjour,

    Je souhaiterai savoir s'il existe des "contre-indications" à la modification de mutables passés en paramètres dans une fonction:

    imaginons que j'aie:

    maFonction(Date maDate) {

    if(uneDateConstante.before(maDate)) {
    maDate = uneDateConstante;
    }

    [...traitement...]
    }


    est-ce correct? Cela semble fonctionner mais quels sont les "risques" que je prends? Cette modification est elle valable uniquement en local dans la fonction où est elle définitive?

    Merci d'avance,

    LDPDC

  2. #2
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 327
    Points
    4 327
    Par défaut
    Bonjour,

    Alors en fait il y a beaucoup de confusions à ce sujet donc je vais tenter d'être le plus clair possible .

    En java les passages de paramètres se font TOUJOURS par copie.
    Soit le paramètre est de type primitif et dans ce cas on va copier la valeur. Soit le paramètre est de type complèxe (et dans ce cas il faut rapeller que quand on manipule des types complèxes on manipule en fait que des références), on va alors également copier ce qu'on passe à la méthode, c'est à dire la référence.

    On récupère donc cette variable et on l'utilise normalement. Si on appelle une méthode sur une référence, et sachant que cette référence est une copie de la référence qu'on a passé, même si ce n'est pas la même elle pointe vers la même instance. Et donc si on appelle une méthode sur cette référence, et que cet appel change l'état de l'instance, alors celle qu'on manipule du code appelant (pointé par les deux références) sera changé (c'est la même). Ce cas de figure ne se pose pas losqu'on va manipuler des primitifs puisqu'ils ne possèdent pas de méthodes.

    Mais lorsqu'on va faire une affectation sur un paramètre de type complèxe, alors on va écraser la référence copié, par une référence vers une autre instance. C'est un peu comme si on redigirait l'appel d'une instance vers une autre. De fait si après une affectation on appel une methode changeant l'état de l'instance, cet état sera bien effectif mais vers une instance différente, et donc l'instance passé par le code appelant ne changera pas d'etat.

    Donc en fait, pour résumer, reaffecter un paramètre c'est EXACTEMENT pareil que créer une nouvelle variable dans le corp de la méthode.

    Bien souvent par rigueure on notera systématiquement les paramètres final afin d'éviter ces confusions.

    Donc oui ce code compile, oui ce code est valide, non il ne va pas changer l'état de ta variable référencé par ton code appelant, oui il faut éviter ces pratiques car ca peut provoquer des confusions.

    J'éspère avoir été compréhensible.

Discussions similaires

  1. Paramètres multiples dans une fonction
    Par MicaelFelix dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/02/2008, 17h06
  2. Paramètres facultatifs dans une fonction
    Par eric41 dans le forum Langage
    Réponses: 3
    Dernier message: 19/07/2006, 13h54
  3. Paramètre optionnel dans une fonction
    Par bractar dans le forum Langage
    Réponses: 3
    Dernier message: 10/03/2006, 17h02
  4. paramètre optionnel dans une fonction
    Par titoumimi dans le forum Langage
    Réponses: 2
    Dernier message: 02/02/2006, 15h29
  5. Paramètre FILE* dans une fonction...
    Par James_ dans le forum C
    Réponses: 16
    Dernier message: 19/01/2006, 16h21

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