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 :

Comment créer un bon constructeur? Dans le cas donné?


Sujet :

avec Java

  1. #1
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2015
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 156
    Points : 52
    Points
    52
    Par défaut Comment créer un bon constructeur? Dans le cas donné?
    Bonsoir! Dites j'ai un petit devoir en Java à faire (que j'ai même fait!) mais j'aimerais avoir vos conseils! J'ai deux classes avec 2 constructeurs chacune et je dois réaliser le deuxième constructeurs de chacune:



    La classe Maillon

    c'est la réalisation Java d’un maillon.
    Elle comprend un attribut element qui est l’élément mis dans la pile et un attribut next qui référence le maillon suivant.
    La classe Maillon n’est visible que par les classes de son espace de noms.
    Elle est définie dans le même fichier que la classe Stack.
    La classe Maillon a deux constructeurs :

    1. un constructeur qui admet un élément passé en argument, dans ce cas le maillon suivant est établi à null lors de la déclaration des attributs.

    2. un constructeur qui admet un élément passé en argument et le maillon suivant.

    La classe Maillon a trois méthodes ayant une visibilité par défaut :

    • Object getElement() retourne l'élément associé au maillon courant
    • Object next() retourne le maillon suivant
    • boolean hasNext() retourne true s’il existe un maillon suivant, false sinon


    Les méthodes de réalisation sont:
    •void setNext(Maillon next) affecte l’attribut next avec le maillon passée en argument
    •void setElement(Object o) affecte l’attribut element avec l’objet o passé en argument

    La classe Stack

    La classe Stack est publique, elle a un attribut top qui référence le premier maillon.

    Elle a deux constructeurs:

    1.un constructeur vide dans ce cas l’élément sommet est égal à null et la pile est vide et de taille zéro.

    2. un constructeur qui admet un élément passé en argument de type Object, dans ce cas, il y a création d’un maillon (instance de la classe Maillon) avec l’élément suivant à null.

    La classe Stack admet les quatre méthodes publiques suivantes :

    • void push(Object object) place au sommet de la pile l’objet passé en argument
    • Object pop() retourne l’élément qui se trouve au sommet de la pile et place l’élément suivant au sommet de la pile.
    • Object first() accède au premier élément de la pile sans modifier la pile boolean
    • isEmpty() retourne true si la pile est vide



    Méthodes de réalisation de la classe Stack:

    •void setTop(Object o) établit le sommet de la pile avec le maillon passé en argument

    • Maillon getTop() retourne le sommet de la pile

    • Maillon next() retourne le maillon suivant





    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Maillon (element, element.next) {
     
    }
     
    public Stack (object element){
        m= new Maillon;
        m.next = null;
    }


    Mais le prof a donné (en incluant dans les classes ses constructeurs...)




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class Stack (Object top){
        private Maillon top;
        public Stack(){}
     
        public Stack(object element){
            setTop new (Maillon (e));
        }
    }


    Et n'a pas donné le code du constructeur de Maillon en disant "pffft, facile" :/

    Mon constructeur est-il pour autant faux?

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Citation Envoyé par AntoineCompagnie Voir le message

    Mais le prof a donné (en incluant dans les classes ses constructeurs...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class Stack (Object top){
        private Maillon top;
        public Stack(){}
     
        public Stack(object element){
            setTop new (Maillon (e));
        }
    }
    Et n'a pas donné le code du constructeur de Maillon en disant "pffft, facile" :/

    Mon constructeur est-il pour autant faux?
    Si tu parles de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Maillon (element, element.next) {
     
    }
     
    public Stack (object element){
        m= new Maillon;
        m.next = null;
    }
    Et bien, dans la mesure où ça ne compile pas déjà, c'est forcément faux (ce n'est pas même pas vraiment du Java). Pourquoi y voit-on un constructeur de Stack qui construit un Maillon (syntaxe incorrecte), et qui bidouille en direct son attribut next.

    Il suffit de lire le sujet : déjà, on doit avoir dans la classe les attributs décrits dans le sujet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    private Object element;
    private Maillon next;

    Ensuite, il suffit de continuer la lecture du sujet :
    Citation Envoyé par AntoineCompagnie Voir le message
    La classe Maillon a deux constructeurs :

    1. un constructeur qui admet un élément passé en argument, dans ce cas le maillon suivant est établi à null lors de la déclaration des attributs.

    2. un constructeur qui admet un élément passé en argument et le maillon suivant.
    donc, on peut déjà écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        private Object element;
        private Maillon next;
     
        public Maillon(Object element) { // ce qui est dit dans 1
        } 
        public Maillon(Object element, Maillon next) { // ce qui est dit dans 2
        }
    Puis on code l'intérieur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
        private Object element;
        private Maillon next = null; // De ce que dit explicitement 1
     
        public Maillon(Object element) {
           this.element=element;
        }
    en fait on peut s'en passer du = null, puisqu'un attribut autre que de type primitif est forcément null par défaut, donc on peut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
        private Object element;
        private Maillon next; // null par défaut
     
        public Maillon(Object element) {
           this.element=element;
           // next null par défaut
        }
    Je te laisse complèter le second constructeur... et le reste.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2015
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 156
    Points : 52
    Points
    52
    Par défaut
    D'accord, merci beaucoup pour ta réponse! C'est super sympa! Est-ce que j'ai juste pour le deuxième constructeur de Maillon?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Class Maillon
        private object element;
        private maillon next;
     
        Maillon (object element){
            this.element=element;
        }
     
        Maillon (object element, Maillon next){
            this.element=element;
            this next=next;
        }
    Pour la classe Stack moi j'aurais fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Public Class Stack
        Public Object top; // mis en Public car la classe est Public
     
        Stack(){}
        Stack (object element){
            m= new Maillon; // création d'un nouveau Maillon 
            m.next = null; // puisque le Maillon suivant est à nul.
            // Mais à quoi sert element du coup?
        }
    Mis le code du prof est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class Stack (Object top){
        private Maillon top;
        public Stack(){}
     
        public Stack(object element){
            setTop new (Maillon (e));
    // ou crée-t-on le suivant? J'ai l'impression qu'on fait appel au premier contructeur et pas au second qui fait appel au suivant.
        }
    }

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par AntoineCompagnie Voir le message
    D'accord est ce que j'ai juste pour le deuxième constructeur de Maillon?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Class Maillon
        private object element;
        private maillon next;
     
        Maillon (object element){
            this.element=element;
        }
     
        Maillon (object element, Maillon next){
            this.element=element;
            this next=next;
        }
    Ça, c'est bon (sauf que c'est Object, pas object, et Maillon, pas maillon (Java est sensible à la casse !)).

    Citation Envoyé par AntoineCompagnie Voir le message
    Pour la classe moi j'aurais fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Public Class Stack
        Public Object top; // mis en Public car la classe est Public
     
        Stack(){}
        Stack (object element){
            m= new Maillon; // création d'un nouveau Maillon 
            m.next = null; // puisque le Maillon suivant est à nul.
            // Mais à quoi sert element du coup?
        }
    Non !

    1. l'element passé en paramètre n'est pas transmis au maillon : il est donc perdu (il faut faire new Maillon(element))
    2. tu bidouilles le maillion de l'extérieur (avec m.next=null) et en plus ça ne sert à rien (il est déjà null par défaut). Un des principes de base en POO, c'est que les comportements sont dans les objets que ça concerne : l'affectation des attributs de Maillon est de la responsabilité de Maillon, pas de Stack. Si une classe, comme Stack par exemple, a besoin de modifier le chainage entre maillons, elle doit appeler la méthode prévu pour ça dans Maillon. S'il n'y en pas, c'est que ça ne doit pas être fait. Il se trouve qu'il soit prévu qu'il y en ait : setNext().
    3. la variable m n'est pas déclarée ! Toute variable doit être déclarée. Ensuite tu crées une instance de Maillon que tu mets dans m, et après ? A la fin de l'exécution du constructeur, m est oubliée, donc l'instance référencée l'est aussi parce qu'on ne l'a mise dans aucune autre variable. Donc ta Stack reste vide !!!
    4. L'attribut top ne doit pas être public : ceci permet à ce qu'on le manipule en direct, donc potentiellement n'importe comment et de tout péter. Il faut toujours penser globalement, pas seulement en te disant "bah je sais je ne le ferais pas" : il faut apprendre à programmer comme si des centaines de personne peuvent se servir de la classe (programmation en équipe, réutilisation du code, etc.). Si un attribut est public, c'est qu'on peut s'en servir comme on veut sans que ça pète tout. Et si on peut s'en servir, quelqu'un le fera un jour, et ça pètera... Le but de private est de l'empêcher et prendre le contrôle sur l'affectation de cette variable (en particulier si on étend par la suite l'objet et qu'on redéfinit certains comportements).
    5. c'est bourré d'erreurs de syntaxe (new Maillon ne compilera pas, Object pas object, class pas Class, public pas Public).


    Citation Envoyé par AntoineCompagnie Voir le message
    Mis le code du prof est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class Stack (Object top){
        private Maillon top;
        public Stack(){}
     
        public Stack(object element){
            setTop new (Maillon (e));
    // ou crée-t-on le suivant? J'ai l'impression qu'on fait appel au premier contructeur et pas au second qui fait appel au suivant.
        }
    }
    Je ne pense pas que cela soit ce que t'a donné le prof, mais ce serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class Stack {
        private Maillon top;
        public Stack(){}
     
        public Stack(Object element){
            setTop(new Maillion(element));
        }
    }
    Mais sinon le principe est là. Le but est de créer un pointeur vers un premier maillon. Et Stack délègue bien à Maillon la gestion de ses propres attributs, en lui transmettant l'information (element) qu'on lui transmet dans son constructeur. Le constructeur sans paramètre créé juste une stack vide, sans maillon.

    Citation Envoyé par AntoineCompagnie Voir le message
    Mis le code du prof est:
    // ou crée-t-on le suivant? J'ai l'impression qu'on fait appel au premier contructeur et pas au second qui fait appel au suivant.
    On créé le suivant dans le code de construction. Mais ce n'est pas le problème : je pense que ta question veut être plutôt "Comment j'ajoute un suivant ?". Et la réponse à cette question est dans la définition de la notion de pile. Le principe d'une pile, dit LIFO, est qu'on ajoute toujours au-dessus et on prend toujours le dernier qu'on a mis. Donc le principe c'est que setTop() doit s'arranger pour que tout nouvel élement passé en argument soit mis dans un maillon, que ce maillon ait pour suivant le maillon qu'il y a dans top à ce moment, et que top deviennent ce nouveau maillon.

    Si on note un maillon [element, next].
    On a une stack avec un seul element qui se note top=[element1,null].
    Après avoir inséré un nouvel élément element2, on aura top=[element2, [element1, null]] (indice pour programmer setTop() : on pourrait écrire top=[element2, ancien top]).

    Donc tu dois programmer setTop() pour que ça fasse ça.

    Ensuite, quand on utilisera la pile, on écrira :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Stack stack = new Stack( 42 ); // créer une pile et met 42 au sommet
    stack.push( 22 ); // on ajoute un nouveau (22) et là setTop, appelée par push(), va faire que le maillon 42 va devenir suivant du nouveau maillon 22
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Par ailleurs, j'ai l'impression qu'il y a une erreur dans l'enoncé que tu présentes.

    En effet, il est dit que :

    Citation Envoyé par AntoineCompagnie Voir le message
    •void setTop(Object o) établit le sommet de la pile avec le maillon passé en argument
    Or l'argument est typé Object, alors qu'on est censé passer un maillon, donc le type de l'argument devrait être Maillon.

    Ceci est confirmé par :
    Citation Envoyé par AntoineCompagnie Voir le message
    2. un constructeur qui admet un élément passé en argument de type Object, dans ce cas, il y a création d’un maillon (instance de la classe Maillon) avec l’élément suivant à null .
    On est bien censé créer un Maillon dans le constructeur de Stack, et le passer à setTop() pour le mettre au sommet.

    Citation Envoyé par AntoineCompagnie Voir le message
    La classe Stack admet les [...] méthodes publiques suivantes :void push(Object object) place au sommet de la pile l’objet passé en argument[...]
    Cette méthode push elle va prendre un Object, créer un nouveau maillon, et appeler setTop pour le mettre au sommet de la pile.
    setTop n'est qu'une méthode utilitaire pour faire les manipulations de chainage (mettre l'ancien top en suivant du nouveau top), et elle devrait être non exposée (donc pas public).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. Réponses: 23
    Dernier message: 28/09/2007, 13h16
  2. [Java] Quel solution pour créer un fichier XML dans mon cas?
    Par petozak dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 23/08/2006, 12h10
  3. [MySQL] Comment créer une sous catégorie dans mon site ?
    Par plex dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 18/08/2006, 09h59
  4. [C#] comment afficher le bon contextmenu dans 1 listview?
    Par irnbru dans le forum Windows Forms
    Réponses: 4
    Dernier message: 09/11/2005, 22h55
  5. Comment créer un champs " BOOLEAN " dans ACCESS ?
    Par Didier100 dans le forum Bases de données
    Réponses: 3
    Dernier message: 21/10/2004, 11h15

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