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 :

Quelles visibilité donner au méthodes d'une classe?


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2015
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 156
    Par défaut Quelles visibilité donner au méthodes d'une classe?
    Bonjour! Je suis en plein apprentissage du langage Java et je butte sur la visibilité à donner au méthodes interne à mes classes à partir du sujet suivant:

    Dans Stack, je souhaite compléter les méthodes setTop(Object), getTop() et next(); dans Maillon, compléter la méthode toString() et préciser la visibilité des méthodes setNext(Maillon), setElement(Object) et toString

    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


    J'ai fait:

    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
     
    public class Stack {
        private Maillon top;
        public Stack(){}
     
        public Stack(Object element){
            setTop(new Maillion(element));
        }
     
        private setTop(object top){//car top est private, mais en même temps j'ai envie d'y accéder, non?
            this.top=top;
        }
     
        public next(element){
            element.next;
        }
    }
    Puis j'ai dit que getTop était public car sinon, il y aurait un non sens à ne pouvoir avoir accès à un getter.
    Puis dans Maillon j'ai modifier toString

    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
     
    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;
        }
     
        toString(){
            system.out.println(element); /*comme j'ai pas plus d'indication...*/
        }
    Comme les attributs étaient private j'ai dit que les méthodes setNext et setElement étaient private.

  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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par AntoineCompagnie Voir le message
    Puis j'ai dit que getTop était public car sinon, il y aurait un non sens à ne pouvoir avoir accès à un getter.
    La réponse est dans cette précision :
    Citation Envoyé par AntoineCompagnie Voir le message
    La classe Maillon n’est visible que par les classes de son espace de noms
    Si la classe n'est visible que dans son espace de nom (visibilité dite "package"), il est inutile de rendre une méthode qui l'utilise public, parce qu'on ne peut de toute manière par récupérer la valeur typée dans sa classe directement et donc la manipuler. On peut le faire par réflexion, mais ça tu verras cette notion beaucoup plus tard : donc il ne faut pas rendre public la méthode, puisque si la classe est de visibilité réduite, c'est parce qu'on ne veut pas qu'on puisse la manipuler n'importe comment en dehors de l'espace de nom.

    Citation Envoyé par AntoineCompagnie Voir le message
    Puis dans Maillon j'ai modifier toString

    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
     
    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;
        }
     
        toString(){
            system.out.println(element); /*comme j'ai pas plus d'indication...*/
        }
    La méthode toString doit retourner un String qui correspond à ce que tu veux qui s'affiche lorsqu'on fera System.out.print( maillon ) ou maillon est une instance de Maillon. On ne doit pas faire de println() dans toString(), sinon ça va interférer avec tous les affichages de cette variable (on va avoir un mélange des messages et donc un sacré bazar).

    Citation Envoyé par AntoineCompagnie Voir le message
    Comme les attributs étaient private j'ai dit que les méthodes setNext et setElement étaient private.
    Non, il n'y a pas de tel rapport entre la visiblité d'un attribut et ses accesseurs ou mutateurs. Ce qui permet de savoir si une méthode est private, public, protected ou default/package, c'est de savoir quelles classes auront le droit d'appeler la méthode (et le fait de rendre private un attribut est justement pour pouvoir prendre le contrôle sur l'accès et la mutation de l'attribut, donc, entre autres, gérer la portée du getter ou du setter).

    La classe Stack doit pouvoir manipuler un maillon (d'ailleurs ta méthode setTop() est incomplète (cf autre discussion)) : la portée des méthodes qui permettent à Stack de manipuler un maillon doit être adaptée à cette nécessité, c'est tout.
    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 confirmé
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2015
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 156
    Par défaut
    D'accord, merci beaucoup pour ta pédagogie!

    1. Donc la classe Maillon n'étant pas visible partout, je ne mets pas les méthodes qui utilisent la classe maillon en public,
      donc je ne mets pas setTop, getTop et next en public, dois je pour autant les mettre en private? C'est ce que le professeur a fait... Et c'est désormais mon sentiment si la classe Maillon n'est visible que par son espace de noms. Je ne sais pas quel est la visibilité par défaut.
    2. Je cherche ensuite à savoir quelles classes auront le droit d'accès à setNext(Maillon) et setElement
      mais je ne suis pas sûr: void push(Object object) qui place au sommet de la pile l'objet passé en argument utilise t il les setters?
    3. Enfin je dois retourner un element de type String avec le toString.
      Je ne suis pas très sûr mais donc je vais faire:

      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
       
      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;
          }
       
          toString(){
              return String (element); 
          }


    PS: j'ai essayé de corriger les potentielles erreurs de casse...

  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 : 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
    pour l'inspiration regarde le code source de la classe LinkedList (bon ce n'est pas un Stack ...et il y a un double chainage entre les "maillons" ... mais on peut arranger ça )
    euh ta méthode toString()

  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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par AntoineCompagnie Voir le message
    D'accord, merci beaucoup pour ta pédagogie!

    [LIST=1][*]Donc la classe Maillon n'étant pas visible partout, je ne mets pas les méthodes qui utilisent la classe maillon en public,
    donc je ne mets pas setTop, getTop et next en public, dois je pour autant les mettre en private? C'est ce que le professeur a fait... Et c'est désormais mon sentiment si la classe Maillon n'est visible que par son espace de noms. Je ne sais pas quel est la visibilité par défaut.
    Pour moi, visible dans le même espace de nom, c'est package pour la classe. Si le prof a mis les méthodes en private, ça veut dire qu'il n'envisage juste pas la possiblité d'étendre la classe Stack, ou du moins que ses filles ne puissent pas appeler setTop()/getTop() (et là il est vrai qu'on peut se demander l'intérêt de getTop() dans ce cas).

    Citation Envoyé par AntoineCompagnie Voir le message
    [*]Je cherche ensuite à savoir quelles classes auront le droit d'accès à setNext(Maillon) et setElement
    La seule qui en a besoin est à la classe Stack : c'est la seule à manipuler les maillons directement. En particulier dans la méthode setTop :
    Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    setTop(maillon)
       maillon.setNext(top);
       top = maillon
    fin setTop

    Citation Envoyé par AntoineCompagnie Voir le message
    mais je ne suis pas sûr: void push(Object object) qui place au sommet de la pile l'objet passé en argument utilise t il les setters?
    push(Object) ne fait qu'un setTop(new Maillon(object)), tout comme le constructeur. C'est juste une exposition (public donc) d'un moyen d'ajouter des objets au sommet de la pile.

    Citation Envoyé par AntoineCompagnie Voir le message
    [*]Enfin je dois retourner un element de type String avec le toString.
    Je ne suis pas très sûr mais donc je vais faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        /*...*/
        toString(){
            return String (element); 
        }
    La méthode toString() doit être déclarée : donc public, déjà, et indiquer le type !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public String toString() {/*...*/}
    Ensuite pour convertir une variable objet de n'importe quel type, contenant une référence vers un objet, ou aussi une référence null : String.valueOf( objet ) ou objet.toString() (mais ne fonctionne pas si objet est null !)

    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public String toString() {
        return String.valueOf( element );
    }
    Mais avec ça, tu vas avoir un petit problème : tu ne pourras afficher que le premier maillon, parce que next n'est pris en compte.

    On pourrait faire, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public String toString() {
        if( next==null ) {
           return String.valueOf( element );
        }
        else {
           return element + " -> " + next; // implicement ça va faire String.valueOf(element) + " -> " + String.valueOf(next);
        }
    }
    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. Visibilité de la méthode d'une classe
    Par alicia26 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 25/05/2007, 13h46
  2. Réponses: 2
    Dernier message: 06/12/2005, 09h41
  3. Création dynamique de méthode sur une classe ?
    Par elitost dans le forum Général Java
    Réponses: 9
    Dernier message: 18/10/2005, 14h47
  4. Réponses: 2
    Dernier message: 31/08/2005, 16h12
  5. [TOMCAT] JSP problème d'accès aux méthodes d'une classes
    Par gunnm dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 22/05/2004, 14h02

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