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 :

appeler une méthode pour créer des objets


Sujet :

Langage Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    75010
    Inscrit en
    Septembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : 75010

    Informations forums :
    Inscription : Septembre 2014
    Messages : 7
    Points : 5
    Points
    5
    Par défaut appeler une méthode pour créer des objets
    Bonjour,

    Nous savons qu'avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void creer(classA a, classB b)
    {
    a = new classA();
    b=new classB();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    main(..)
    {
    classA a;
    classB b;
    creer(a,b);
    // a et b restent == null
    }
    Question : comment faire pour appeler une méthode pour créer nos deux objets ?
    Un peu comme en C : creer (&a,&b);

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par adan1 Voir le message
    Question : comment faire pour appeler une méthode pour créer nos deux objets ?
    Merci
    ehhhh je ne suis pas certain de comprendre la question puisque la réponse est dans la question et puis que le code est déjà fait

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par adan1 Voir le message
    Question : comment faire pour appeler une méthode pour créer nos deux objets ?
    Hello,

    en résumé la réponse est "il ne faut pas faire ça. Il ne faut pas vouloir faire ça. Il faut programmer mieux, et éviter les mauvaises structures."

    Ce qui se rapproche le plus de la manière de faire la même chose d'une façon correcte, c'est :

    créer une classe MonContexte qui contient un ClassA et un ClassB :

    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
    public class MonContexte {
      private ClassA a;
      private ClassB b;
     
      public void setA(ClassA a) {
        this.a = a;
      }
     
      public void setB(ClassB b) {
        this.b = b;
      }
     
      public ClassA getA() {
        return a;
      }
     
      public ClassB getB() {
        return b;
      }
    }
    Et ensuite modifier creer ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void creer(MonContexte ctx) {
      ctx.setA(new ClassA());
      ctx.setB(new ClassB());
    }
    et l'utiliser ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MonContexte ctx = new MonContexte();
    creer(ctx);
    ClassA a = ctx.getA();
    ClassB b = ctx.getB();
    Alternative :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    MonContexte creer() {
      MonContexte ctx = new MonContexte();
      ctx.setA(new ClassA());
      ctx.setB(new ClassB());
      return ctx;
    }
    et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MonContexte ctx = creer();
    ClassA a = ctx.getA();
    ClassB b = ctx.getB();
    Évidemment, à partir du moment où on se rend compte qu'on a besoin d'une classe intermédiaire comme "MonContexte", on peut aussi se dire qu'elle pourrait s'occuper elle-même d'appeler le générateur de ses éléments a et b,
    et tant qu'à faire on pourrait se contenter d'appeler getA() et getB() dessus quand on en a besoin, au lieu de les assigner à des variables locales. La plupart du temps ça fait moins de code et c'est plus clair.
    De manière générale, voir ce qu'on peut lui déléguer et qui devrait être son travail plutôt que le travail d'un autre.

    On pourrait aussi se demander si on aurait pas meilleur compte de simplement faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ClassA a = creerA();
    ClassB b = creerB();
    Citation Envoyé par Mat.M Voir le message
    ehhhh je ne suis pas certain de comprendre la question puisque la réponse est dans la question et puis que le code est déjà fait
    La question est "comme nous le savons tous, ça ça marche pas. Qu'est-ce qui marche à la place ?"
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre chevronné
    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 : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    d'un point de vue strictement théorique il est considéré qu'il n'est pas bon pour la santé des codes de modifier un paramètre et que c'est plus propre d'avoir un paramètre en entrée et un résultat en sortie (oui je sais: c'est un principe qui n'est pas toujours suivi ) donc dans les exemples ci-dessus il me semble mieux soit de rendre un résultat produit par la méthode (sans modifier un paramètre) soit de ne pas se casser la tête.
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par adan1 Voir le message
    Bonjour,

    Nous savons qu'avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void creer(classA a, classB b)
    {
    a = new classA();
    b=new classB();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    main(..)
    {
    classA a;
    classB b;
    creer(a,b);
    // a et b restent == null
    }
    Question : comment faire pour appeler une méthode pour créer nos deux objets ?
    Un peu comme en C : creer (&a,&b);

    Merci
    Java n'est pas comme C, on passe toujours les paramètres par valeur, même si c'est un objet.
    En gros, on copie la valeur de l'adresse de l'objet dans le paramètre de la méthode cible (ici creer).
    Donc, pour résumer :
    1- dans main(...)
    on créé 2 variables qui contiendront une adresse de type classA et classB.
    on appelle la méthode creer(a, b)
    on copie la valeur de la variable a dans le paramètre a de la méthode et la valeur de la variable b dans le paramètre b (à noter qu'ici, on a NULL).
    2- dans creer(...)
    on créé une instance de classA et on met son adresse dans la variable a de la méthode
    on créé une instance de classB et on met son adresse dans la variable b de la méthode (à noter qu'à aucun moment on ne travaille sur les variables de main)

    Du coup, normal que dans main rien n'ait changé.
    Par contre, si on avait instancié les objets de classA et classB dans main, on aurait pu modifier des propriétés de ces deux instances dans la méthode creer(...)

    En C c'est différent avec &a parce que là, on passe l'adresse de la variable a de "main", donc dans la méthode creer(a, b), on travaille sur les mêmes "conteneurs" d'adresses d'objets.

    (en espérant t'avoir éclairé)

    Sinon, dans le principe, je ne vois pas trop l'intérêt de cette construction et le code de thelvin résume bien ce qu'il faudrait faire pour instancier plusieurs objets à un seul endroit.
    On aurait une variante qui consisterait à utiliser une liste (ou un map) d'objets en retour d'une méthode, quelque chose comme ceci :
    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
     
    private Object[] creer()
    {
       Object[] result = new Object[2];
       result[0] = new classA();
       result[1] = new classB();
       return result;
    }
     
    et dans main on aurait :
     
    Object[] init = creer();
     
    classA a = init[0];
    classB b = init[1];
    mais bon, c'est vraiment pourri comme façon de faire...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Futur Membre du Club
    Homme Profil pro
    75010
    Inscrit en
    Septembre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : 75010

    Informations forums :
    Inscription : Septembre 2014
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    OK merci beaucoup.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 04/11/2020, 00h18
  2. [Débutant] appelé une méthode qui contient des objets
    Par zied_m dans le forum VB.NET
    Réponses: 2
    Dernier message: 01/08/2017, 15h02
  3. Problème pour créer des objets de la même classe
    Par Dietzer dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 25/06/2009, 17h01
  4. Réponses: 2
    Dernier message: 08/06/2009, 14h46
  5. Réponses: 2
    Dernier message: 04/06/2009, 14h49

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