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

avec Java Discussion :

Histoire de passage d'argument


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 343
    Par défaut Histoire de passage d'argument
    Bonjour,

    je voudrais créer une fonction qui me retourne une information sous forme d'un entier, et qui me fournit aussi une date correspondant à la valeur de retour; l'exemple sera plus parlant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int donneEtatEtDate( Date dateTransmise )
    {
      dateTransmise = new Date( uneDateMembrePrive );
      / ... /
      return valeur_en_rapport_avec_date;
    }
    uneDateMembrePrivé est un membre privé, je ne veux donc pas donner son instance. Si je programme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dateTransmise = uneDateMembrePrive
    ce membre peut alors être modifié par le code qui récupère dateTransmise; est-ce que ce raisonnement est juste ?
    Donc j'initialise dateTransmise à l'aide de new() ce qui me donne donc un clone du membre privé et protège donc la donnée privée; est-ce que ce raisonnement est juste ?

    Je récupère donc en retour une information, et une date correspondant à cette information; y a-t-il une autre solution à ce genre de problème ?

    @ bientôt...

  2. #2
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Déjà, il faut savoir qu'en java, on passe les arguments par copie de référence.

    Donc, réaffecter dateTransmise dans ta méthode n'affectera pas la valeur utilisée à l'appel de ta méthode. Par contre, tu peux faire si tu veux effectivement modifier l'instance utilisée à l'appel de la méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int donneEtatEtDate( Date dateTransmise )
    {
      dateTransmise.setTime(uneDateMembrePrive.getTime());
      / ... /
      return valeur_en_rapport_avec_date;
    }

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Explicitons donc que cela n'est possible qu'avec des classes mutables, telles que Date, et impossible avec des classes immutables, telles que String et Integer.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 343
    Par défaut
    Bonjour Thelvin,

    Si j'ai bien compris: la classe Date est mutable, ce qui signifie que si je code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dateTransmise = uneDateMembrePrive
    alors uneDateMembrePrive pourra être modifié par le code appelant ?

    Donc l'idée de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dateTransmise = new Date( uneDateMembrePrive );
    est une bonne chose ?

    Cette précaution n'est pas nécessaire avec des classe comme String ou Integer, j'ai bon là ?

    @ bientôt...

  5. #5
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Ou pas.

    Une classe Immutable est une classe en lecture seule, donc on ne peut modifier le contenu. Par exemple on ne peut modifier le contenu d'une String.

    Une classe Mutable est un classe dont le contenu peut être modifié.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Wow. Et moi qui pensais avoir apporté le dernier élément à clarifier... J'aurais mieux fait de fiche la paix à mon clavier, tiens.

    Citation Envoyé par rtg57 Voir le message
    Si j'ai bien compris: la classe Date est mutable, ce qui signifie que si je code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dateTransmise = uneDateMembrePrive
    alors uneDateMembrePrive pourra être modifié par le code appelant ?

    Donc l'idée de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dateTransmise = new Date( uneDateMembrePrive );
    est une bonne chose ?

    Cette précaution n'est pas nécessaire avec des classe comme String ou Integer, j'ai bon là ?
    Non. Qu'une classe soit mutable ou immutable n'a pas le moindre effet sur l'opérateur d'assignation.

    Ce que je voulais dire, c'est qu'un objet mutable a des méthodes setTruc(), setMachin(), et autres choses qui permettent de modifier son état interne. Ainsi, on peut modifier un objet mutable passé en paramètre.

    Par contre, un objet immutable n'a pas de méthode en setTruc() qui permette de changer son état interne, son état interne est constant, parce que c'est ça que ça veut dire, immutable. Bref, comme dirait Lapalisse, on ne peut pas muter un objet immutable, et par conséquent l'astuce du dessus, qui peut être utilisée avec des objets mutables, ne peut pas l'être avec des objets immutables.
    Une bonne raison pour organiser son code autrement, de sorte que ça marche dans tous les cas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 343
    Par défaut
    Merci à tous pour votre aide.

    @ bientôt.

  8. #8
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par rtg57 Voir le message
    Bonjour Thelvin,

    Si j'ai bien compris: la classe Date est mutable, ce qui signifie que si je code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dateTransmise = uneDateMembrePrive
    alors uneDateMembrePrive pourra être modifié par le code appelant ?
    Je le redis pour être sûr quand même : si tu ne renvoies pas dateTransmise, alors de toute façon le code appelant n'aura jamais aucun contact avec uneDateMembrePrive, car la variable du code appelant ne pointera plus vers la même chose que dans le code appelé.

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

Discussions similaires

  1. passage d'argument sur l'imprimante
    Par linux dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 07/10/2005, 16h25
  2. [JAVASCRIPT] passage d'argument à une fonction
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 03/06/2005, 18h17
  3. [TASM] Passage d'argument à une macro
    Par sorry60 dans le forum Assembleur
    Réponses: 13
    Dernier message: 23/04/2005, 18h22
  4. [web] passage d'arguments à un CGI
    Par ma2th dans le forum Web
    Réponses: 4
    Dernier message: 20/08/2004, 12h18
  5. passage d'argument à la procédure main ()
    Par Zazeglu dans le forum C
    Réponses: 5
    Dernier message: 01/09/2003, 19h59

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