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 :

Contourner l'absence de paramètre out


Sujet :

Java

Vue hybride

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Par défaut Contourner l'absence de paramètre out
    Bonjour,

    J'ai une fonction assez grosse (et donc peu lisible) dans laquelle j'aimerais exporter une partie du code dans des fonctions.

    En effet, à divers endroits, je fais des choses similaires mais dans ce code à exporter, je dois par exemple modifier 2 Map.
    En C, j'aurais mis ces paramètres en in/out mais comme en Java on ne peut pas, quelle est la solution de contournement?

    Merci.

  2. #2
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Je ne suis pas sûr d'avoir bien compris.

    Qu'est-ce qui t'empêche de passer tes Map comme arguments de ta/tes fonctions?

  3. #3
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Un exemple vaut mieux qu'un long discours :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static void test1(Map map) {
       map = new HashMap();
       // modification visible localement, mais qui n'a aucun effet une fois qu'on est
       // sorti de la méthode.
    }
     
    public static void test2(Map map) {
       map.put("test", "test");
       // modification de l'objet passé en paramètre : cette modification sera visible
       // en dehors de cette méthode.
    }
    Pour plus d'explication, tu peux lire de la documentation théorique sur le passage des paramètres par référence/copie/... et sur le mécanisme utilisé par Java.
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Par défaut
    J'ai pas très bien vu la différence entre les 2 fonctions...

    Dans la première, le fait de faire new ne change pas l'objet passé alors que si on ajoute ou qu'on enlève des éléments cela change l'objet passé en argument?


    Par contre pour les String par exemple (et autres Wrapper), , ils sont "IMMUTABLES" j'ai lu donc là, dans tous les cas on ne peut en faire un paramètre in/out

  5. #5
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par stof Voir le message
    J'ai pas très bien vu la différence entre les 2 fonctions...

    Dans la première, le fait de faire new ne change pas l'objet passé alors que si on ajoute ou qu'on enlève des éléments cela change l'objet passé en argument?
    C'est le même principe en C. Un objet en Java est un pointeur. Si tu fais un malloc sur un pointeur transmis en paramètre, la zone transmise en paramètre n'est plus modifiable dans la suite de la fonction mais existe toujours et est modifiable ailleurs dans le programme.
    Si tu transmets un pointeur à une fonction, tu peux modifier la zone comme tu veux.

    Par contre pour les String par exemple (et autres Wrapper), , ils sont "IMMUTABLES" j'ai lu donc là, dans tous les cas on ne peut en faire un paramètre in/out
    Rien ne t'empêche de passer par un StringBuilder, ou même de créer ta propre classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class StringInOut
    {
      public String string;
    }
    Un peu coder vite fait, mais maintenant, tu peux faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void ma_fonction( StringInOut s )
    {
      s.string = "nouvelle chaine";
    }
    Et la chaine pointée par StringInOut sera changée à l'extérieur de la méthode.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  6. #6
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Ma maman m'ayant dit que les paramètres "out" étaient caractéristiques de langages archaïques, je peux me résoudre à de simples effets de bord (on invoque sur un paramètre une méthode qui change l'état de l'objet) ou bien à faire des exercices de style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public class ReferenceDure<T> {
          public T valeur ;
    }
    et ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public ReferenceDure<String> modifieur(ReferenceDure<String> arg) {
           arg.valeur = "NabuccoDinosaure" ;
           return arg;
    }

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

Discussions similaires

  1. [MySQL] Paramètre OUT dans procedure stockée
    Par Nandacore dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 20/08/2009, 17h58
  2. Réponses: 9
    Dernier message: 11/03/2009, 16h30
  3. comment contourner l'absence de tableau croisé
    Par lotfilol dans le forum BIRT
    Réponses: 2
    Dernier message: 12/07/2007, 15h51
  4. paramètres out dans les services web
    Par adaneels dans le forum Delphi .NET
    Réponses: 1
    Dernier message: 11/04/2007, 10h14
  5. Réponses: 1
    Dernier message: 01/06/2006, 11h31

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