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

Collection et Stream Java Discussion :

Destruction objet Java + modification HashMap


Sujet :

Collection et Stream Java

  1. #1
    Membre actif Avatar de Vespiras
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 168
    Points : 265
    Points
    265
    Par défaut Destruction objet Java + modification HashMap
    Bonjour

    Je suis en mode éponge sur le langage Java en ce moment, et je dois avouer que certaines choses m'échappent, au niveau des meilleures pratiques à adopter.

    Situation :
    J'ai 3 classes qui n'héritent de rien (toutes des classes mères):
    • Instrument
    • Musicien
    • Factory


    Dans ma classe Factory, j'ai :
    • un HashMap d'entiers et de Musiciens
    • un HashMap d'entiers et d'Instruments


    Et également une méthode permettant la suppression d'un Musicien.

    Dans ma classe Musicien, je possède un attribut "perso" de type Instrument. (dans lequel on stockera l'instrument personnel du musicien)

    Dans ma classe Instrument, je possède un attribut "lock" qui vaut "true" si l'instrument en question appartient à un musicien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected boolean lock;
    Problème :
    Lorsque j'appelle ma méthode de suppression d'un musicien, j'entre l'id voulu (entier) et je le supprime de la liste de classe Factory, et j'aimerais conserver son instrument, en remettant l'attribut "lock" de celui-ci à false. (pour qu'il puisse être réaffecté)

    Seulement j'ai beau modifier dans mon HashMap d'instrument à l'id correspondant, il me laisse toujours cet attribut à "true" et je ne peux plus utiliser l'instrument qui a appartenu au musicien supprimé.

    Voici mon code de suppression :
    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
    Saisie hSaisie = new Saisie();
    System.out.println("Veuillez entrer le numéro du musicien à supprimer :");
    int num = hSaisie.saisieInt();
    Main hMain = new Main();
    // si le musicien est trouvé dans la liste
    if (tMusiciens.remove(num) != null) {
    	// liberer l'instrument
    	 hMain.unlock(num);
    	 // on va chercher dans les orchestres
    	... // tout un tas de traitement pas en rapport
    	  System.out.println("Le musicien " + num + " a été supprimé");
    	} else {
    	  System.out.println("Aucun musicien portant le numéro " + num + " n'éxiste dans la liste");
    	}
    return tMusiciens;
    Ici, je pense j'appelle sans problème la méthode du main qui va libérer l'objet voulu.

    Et ici voici le code de hMain.unlock() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void unlock(int id) {
    if (this.tInstruments.containsKey(id)) {
            Instrument tmp = this.tInstruments.get(id);
            tmp.lock = false;
            this.tInstruments.put(id, tmp);
        }
    }
    Je vérifie si l'id existe dans le HashMap, je récupère l'objet, je modifie l'attribut lock, et j'écrase l'objet qui existait avec le même id.

    Quelqu'un aurait-il une idée d’où vient le problème svp ?

    Il n'y a aucune erreur de compilation, et mon programme fonctionne normalement, il y a juste le lock qui ne se modifie pas !

  2. #2
    Membre régulier
    Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 78
    Points
    78
    Par défaut
    t'as pas besoin de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.tInstruments.put(id, tmp);
    car tmp est une référence vers l'instrument.

    sinon à première vue je vois pas d’où viens le problème. essaye de debugger avec ton IDE surtout la méthode unlock pour voir. Et si ça se débloque pas n'hésite pas à mettre tes classes en pièces jointes pour qu'on puisse t'aider.

  3. #3
    Membre actif Avatar de Vespiras
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 168
    Points : 265
    Points
    265
    Par défaut Debbuger
    Je viens d'observer mes variables, et il se trouve que dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void unlock(int id) {
    if (this.tInstruments.containsKey(id)) {
            Instrument tmp = this.tInstruments.get(id);
            tmp.lock = false;
        }
    }
    la condition renvoie false dans le if.
    J'ai essayé if(this.tInstruments.get(id) != null) et la condition renvoie false également.

    Pourtant lorsque j'affiche mon HashMap tInstruments, je vois bien des éléments présents correspondants à l'id que je passe en paramètre dans unlock().

    Je suis surement embrouillé mais ça me parait bizarre ...

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2013
    Messages : 10
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    Dans ta condition de la méthode unlock tu utilise "this" qui fait appel à ta classe Main si je comprends bien, seulement, tu dis que ta HashMap est dans une classe Factory. Remplace les this de condition et de modification par ta classe Factory.

  5. #5
    Membre actif Avatar de Vespiras
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 168
    Points : 265
    Points
    265
    Par défaut
    Au temps pour moi, ces HashMaps sont contenus dans la classe Main, et je les passe généralement en paramètres pour faire des opérations dans Factory, puis je les retourne dans le main.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2013
    Messages : 10
    Points : 13
    Points
    13
    Par défaut
    Pourrais tu rajouter le code de création de musicien et d'instrument et les trois classes Factory, Musicien et Instrument.

  7. #7
    Membre actif Avatar de Vespiras
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 168
    Points : 265
    Points
    265
    Par défaut
    Je met en pièce jointe les classes concernées, en espérant que ça sera pas fouillis :

    Merci à tous ceux qui regardent

    NB : Surtout n'hésitez pas à me proposer une autre manière de faire si vous en voyez une plus simple ou plus optimisée, ca ne me dérange pas de tout refaire, je préfère partir sur de bonnes bases avec Java.
    Fichiers attachés Fichiers attachés

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2013
    Messages : 10
    Points : 13
    Points
    13
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tInstruments.put(this.nbInstruments, nv);
    Lorsque tu crées un instrument tu utilises le nombre d'instrument comme id de ta HasMap.
    Dans ta méthode unlock, tu recherches l'instrument avec instrument.id
    Tu devrais mettre comme clé de ta map l'instrument.id et ça devrait marcher.
    soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tInstruments.put(nv.getId, nv);

  9. #9
    Membre actif Avatar de Vespiras
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 168
    Points : 265
    Points
    265
    Par défaut
    Heu ... nv est l'instance d'un objet de type Violon que j'utilise lorsque je créé un instrument, si l'instrument choisi est un Violon.

    Je précise que j'ai un héritage qui part de la classe mère Instrument > Cordes, Vent et Percussion > Violon, Guitare, ... qui héritent de Cordes, Flute, Trompette qui héritent de Vent.

    Le problème c'est que j'ai fait exactement ce que tu m'as dit avant, en passant lock à false et en ajoutant l'id de l'objet appartenant au musicien dans la liste (avec l'objet au lock modifié associé à cet id)

    Mais ca me faisait exactement pareil qu'avec le code que j'ai actuellement dans unlock.

  10. #10
    Membre régulier
    Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 78
    Points
    78
    Par défaut
    bonjour,

    essaye comme ça :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    public Map<Integer, Instrument> creerInstrument(Map<Integer, Instrument> tInstruments) {
    	Saisie hSaisie = new Saisie();
    	int choix = 0;
    	while (choix < 1 || choix > 6) { // verifier la logique de cette IF            
    	    System.out.println("Choisissez maintenant entre les options suivantes :\n" + "1- Violon\n" + "2- Guitare\n"
    		    + "3- Contrebasse\n" + "4- Flute\n" + "5- Trompette\n");
    	    choix = hSaisie.saisieInt();
                Instrument instrument=null;
    	    switch (choix) {
    	    // création d'un instrument en fonction du choix
    	    case VIOLON:
    		instrument = new Violon(this.nbInstruments);		
    		break;
    	    case GUITARE:
    		instrument = new Guitare(this.nbInstruments);		
    		break;
    	    case CONTREBASSE:
    		instrument = new Contrebasse(this.nbInstruments);		
    		break;
    	    case FLUTE:
    		instrument = new Flute(this.nbInstruments);		
    		break;
    	    case TROMPETTE:
    		instrument = new Trompette(this.nbInstruments);		
    		break;
    	    default:
    		System.out.println("Commande invalide, réessayez");
    	    }   
              if(instrument!=null){
                  instrument.afficherInstrument();
    	     tInstruments.put(instrument.getId(), instrument);
                 this.nbInstruments++;
             }
     
    	}
     
    	return tInstruments;
        }

  11. #11
    Membre actif Avatar de Vespiras
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 168
    Points : 265
    Points
    265
    Par défaut
    Je vais essayer, en revanche pour répondre à ta question en commentaire, ce "if" permet de reproposer un choix si la personne tape un chiffre qui ne correspond pas à un instrument.

    Je sais que c'est dur de se mettre dans le code qu'un autre a fait ^^

Discussions similaires

  1. uigetdir : modification d'un objet java
    Par ParkerL31884 dans le forum Interfaces Graphiques
    Réponses: 0
    Dernier message: 23/09/2014, 11h00
  2. [Profiling] Mémoire utilisée par objet java
    Par Bicnic dans le forum Général Java
    Réponses: 2
    Dernier message: 05/01/2006, 09h52
  3. [Collections][HashMap]Comparer les objets de la hashmap
    Par rvfranck dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 16/12/2005, 21h29
  4. [Excel][VBA][Java] Appeler un objet java
    Par ay_pepito dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 29/07/2005, 15h46
  5. [SAX] Passer d'objet java en fichier XML?
    Par spoutyoyo dans le forum Format d'échange (XML, JSON...)
    Réponses: 15
    Dernier message: 05/01/2005, 08h31

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