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
    Membre du Club
    Homme Profil pro
    75010
    Inscrit en
    Septembre 2014
    Messages
    7
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 63
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : 75010

    Informations forums :
    Inscription : Septembre 2014
    Messages : 7
    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 confirm�
    Avatar de Mat.M
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 540
    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 540
    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 585
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    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 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 : 77
    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
    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.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    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
    Membre du Club