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 :

[Conception][Debutant] Navigation bidirectionnelle


Sujet :

Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 70
    Par défaut [Conception][Debutant] Navigation bidirectionnelle
    Bonjour,

    Etant débutant sous Java, je désirerai savoir comment créer une association doublement navigable.

    Par exemple : j'ai une classe Photo & une classe Album.
    J'aimerai qu'une instance de photo pointe vers son album et reciproquement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class TestAlbum() {
     
    public static void main(String args[]) {
    Album album = new Album();
    Photo photo = new Photo();
    photo.setAlbum( album );
    }
     
    }
    Voici ma classe Album

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Album {
     
    protected Photo[] listePhoto = new Photo[5];
    protected int indice = 0;
     
    public Album() {}
     
    }
    Et ma classe Photo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Photo {
     
    protected Album album;
     
    public Photo() {}
     
    public void setAlbum( Album album ) {
    this.album = album;
    }
     
    }
    Le problème c'est qu'en procédant ainsi je n'ai pas le lien depuis album vers Photo.

    Merci de m'indiquer comment faire.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 897
    Billets dans le blog
    54
    Par défaut
    Bien qu'au depart une photo n'ai pas d'album c'est tout a fait normal.

    Tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Photo photo = new Photo();
    album.add(photo);
    Ou la methode add de la classe Album est qqchose du style :

    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
    21
    22
    23
    24
    25
     
    public class album {
     
    ...
     
      /** Add given photo to this album.
      * @param Photo a photo, maybe <code>null</code>.
      */
      public void add(Photo photo) {  
        if (photo != null) {
          Album oldAlbum = photo.getAlbum();
          // Given photo is already in this album; do nothing.
          if (oldAlbum == this) {
            return;
          }
          // Remove photo from previous album.
          else if (oldAlbum != null) { 
            oldAlbum.remove(photo);
          } 
          // Add photo to this album.
          photo.setAlbum(this);
          photoList.add(photo);
        }
      }
    }
    Je te conseille plutot une List<Photo> ou une Map<String, Photo> ou Map<Date, Photo> (ou Map<Long, Photo>, ...) pour stocker les photos dans une liste ou une map les indexant par leur nom ou leur date de creation ou d'insertion (ou un autre critere quelconque) plutot qu'un tableau qu'il te faudra reallouer pour l'agrandir lors de l'insertion de nouvelles photos.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 70
    Par défaut
    Merci de la réponse (j'ai pas pu me connecter + tôt).

    La méthode add() de Album appelle donc la méthode public setAlbum() de photo. Ce qui me trouble c'est le fait que l'utilisateur de la classe (celui qui fait le main) peut appelé simplement setAlbum depuis photo auquel cas l'association ne sera pas bi-directionnelle.

  4. #4
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Hello,

    à toi de mettre le code nécessaire dans la méthode setAlbum...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Photo {
      void setAlbum(Album a) {
        // set album
        this.album = album;
     
        // add this to album if necessary
        if(! a.contains(this))
          a.add(this);    
      }
     
    }


  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par DarkNagash
    Ce qui me trouble c'est le fait que l'utilisateur de la classe (celui qui fait le main) peut appelé simplement setAlbum depuis photo auquel cas l'association ne sera pas bi-directionnelle.
    Il faut que tes classes Photo et Album appartiennent au même package, et que tu passes ta méthode setAlbum() en visibilité protected ou package-only (voir la FAQ pour plus de détail sur l'accessibilité des éléments) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void setAlbum( Album album ) {
            this.album = album;
    }
    La méthode setAlbum() ne pourra être utilisé que depuis les classes du même package...

    a++

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 70
    Par défaut
    OK merci pour l'astuce sur la visibilité. Pour mon projet ça ne pose pas de problème de les mettre dans le mm package.

    Mais si je généralise il n'y a donc pas de moyen de la faire si les classe appartiennent à 2 packages différents?

  7. #7
    Membre émérite Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Par défaut
    Si si ton attribut n'est pas en visibilité protected

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 70
    Par défaut
    Oui donc il est en visibilté package d'où le problème

  9. #9
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2004
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 230
    Par défaut
    moi pour faire plus simple j'aurai fait une troisime classe prenant comme constructeur une photo et un album

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 70
    Par défaut
    Mais si la troisieme classe appartient a un autre package elle ne peut qu'accéder au méthodes publiques donc on revient au problème.

  11. #11
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2004
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 230
    Par défaut
    ben alors il les met publique !! en quoi ca gene ?

  12. #12
    Membre émérite Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Par défaut
    Le modifieur protected ne restreint pas qu'au package mais aux enfants... Cela veut dire qu'une classe enfant d'une classe protected peut très bien se trouver dans un autre package

Discussions similaires

  1. [debutant] navigation webform (ouverture et fermeture)
    Par noname_971 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 21/10/2008, 10h05
  2. [Debutant] Navigation rep en C
    Par ludotech dans le forum C
    Réponses: 7
    Dernier message: 20/12/2005, 12h42
  3. [débutant][Conception] Comment faire un arbre?
    Par dr_m1 dans le forum Général Java
    Réponses: 4
    Dernier message: 08/10/2004, 00h08
  4. [débutant][Conception] Modélisation pour éviter le getClass()
    Par Oliveuh dans le forum Général Java
    Réponses: 9
    Dernier message: 28/06/2004, 20h00
  5. [Débutant][Conception] Erreur avec une classe interne
    Par Devil Redneck dans le forum Général Java
    Réponses: 5
    Dernier message: 11/06/2004, 15h45

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