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 :

Double NewInstance() bug


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 18
    Par défaut Double NewInstance() bug
    Bonjour à tous ,

    J'ai un problème au niveau de la fonction NewInstance().
    Pour l'exemple de code, on suppose que je travaille sur un type objet que j'ai personnellement crée.
    Pour des besoins personnels j'instancie mon objet dans un Manager, qui est composé d'une Static ArrayList<Objet>.

    Code de création d'une instance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ObjetManager.nouveau((Objet) objet.newInstance(param1, param2, ...));
    Lors du premier affichage du contenu de mon manager, tout est niquel j'ai bien mon unique objet instancie. Seulement cela se complique lorsque je réexécute cette fonction newInstance() avec un autre objet. En effet, cela fonctionne bien il me crée le nouvel objet...mais AVANT CELA il m'a recréer une seconde fois l'objet précédemment crée. Donc dans mon manager au lieu d'avoir: Objet1, Objet2... j'ai à la place Objet1,Objet1,Objet2...
    Et ça continue...si j'en refait un autre j'aurai Objet1,Objet1,Objet2,Objet2,Objet3...

    Donc ma question est: Faut t'il faire une manip' de "nettoyage" ou je ne sais quoi entre deux utilisations de la fonction NewInstance() ?

    Je sais pas si j'ai été très clair dans mon exemple, si ce n'est pas le cas n'hésitez pas à demander plus de détails .

  2. #2
    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,


    D'où sort cette méthode newInstance() ? Sans code impossible de t'aider...


    a++

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 18
    Par défaut
    D'accord je vais être plus précis.

    Enfaite je cherche à modéliser des prototypes des objets que je souhaite créer.

    J'ai une interface Objet qui est implémentées par ces 3 classes:ObjetA, ObjetB et ObjetC.

    Ensuite j'ai une interface Prototype qui est elle implémentées par les classes ProtoA, ProtoB et ProtoC. (ObjetA correspondant à ProtoA et ainsi de suite...)

    J'ai ensuite un ProtoManager qui est chargé par les blocs statiques (static{}) de mes classes ProtoA, ProtoB et ProtoC lorsque je fait des Class.forName("ProtoA"). Ces blocs statiques font tout simplement un NewProtoA(), NewProtoB() ou NewProtoC() selon la classe dans laquelle ils sont.

    J'ai enfin un ObjetManager qui répertorie tous les objets crées.

    Un bout de mon main:
    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
    //Instantiation dynamique de mes 3 prototypes
                    Class.forName("ProtoA");
    		Class.forName("ProtoB");	
    		Class.forName("ProtoC");
     
    // récupération du choix du protoype avec un scanner
    Scanner saisie = new Scanner(System.in);
    		int choix = saisie.nextInt() - 1;
     
    /* je déclare un objet prototype dans lequel je met le prototype correspondant, 
    on part du principe que 1 correspond à ObjetA, 2 à ObjetB etc...
    Si choix vaut 1 on met le 1er prototype contenu dans ProtoManager (ici ProtoA)*/
    		Prototype objetChoisi = ProtoManager.get(choix);
     
    /*Enfin j'instancie ma nouvelle classe que je met directement dans mon Manager
     (La fonction nouveau() se contente de faire un add du paramètre 
    dans l'arrayList contenu dans la classe ObjetManager)*/
    		Manager.nouveau((Objet) objetChoisi.newInstance(param1, param2, ...));
    Ce code fonctionne parfaitement lors de la 1ère instantation. Mais lors de la deuxième, avant de rajouter la 2ème instantiation il recopie d'abord la précédente. Donc au lieu d'avoir Objet1, Objet2 je me retrouve avec Objet1,Objet1,Objet2...

    Merci d'avance je sais pas si j'ai été clair

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par Ro0ys Voir le message
    Merci d'avance je sais pas si j'ai été clair
    Pas le moins du monde.

    Premièrement, tu n'as pas répondu à la question "c'est quoi NewInstance() ?"

    Deuxièmement, quitte à nous parler de "ça fait juste NewProtoA(), NewProtoB() ou NewProtoC()", ça aurait pu être intéressant de nous parler d'elles aussi, et en fait de nous montrer à quoi elles ressemblent, à quoi ressemble le code qui s'en sert, et en fait tout le code structurel de ce dont tu es en train de nous parler.

    Troisièmement, si on pouvait aussi avoir une idée du but de tout ça... C'est bien beau d'essayer de nous dire ce que tu fais, mais ça commence par dire pourquoi.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 73
    Par défaut
    1 - Je ne comprends pas très bien ton problème:
    Si tu appelles deux fois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ObjetManager.nouveau((Objet) objet.newInstance(param1, param2, ...));
    il me parait normal que deux objets soient créés et se trouvent dans ton Manager.
    Si lors de l'appel à objet2.newInstance(...) un nouveau objet est ajouté dans ton ObjetManager sans que tu aies invoqué la méthode "nouveau" c'est qu'il y a surement un problème dans ta fonction newInstance(...)

    2 - Si tu veux éviter les doublons d'objets égaux dans ObjetManager, tu peux utiliser un Set au lieu de ta liste

    3 - Tu devrais essayer de refactorer ton code en utilisant par exemple un design pattern Factory si ça correspond à tes besoins, car ce que tu présentes paraît un petit peu complexe.

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 18
    Par défaut
    Ok merci beaucoup à vous pour vos réponses.

    J'ai finalement trouvé la réponse à ma question, j'ajoutais tout simplement deux fois mon nouvel objet dans mon manager mais à deux endroits différents dans deux classes différentes...

    Désolé pour la gêne occasionnée. Je le passe en résolu.

    Merci.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 29/01/2009, 17h31
  2. Réponses: 10
    Dernier message: 13/10/2008, 16h35
  3. Bug Requête : 1ère ligne en double
    Par Arsene12 dans le forum WinDev
    Réponses: 2
    Dernier message: 04/01/2008, 07h04
  4. Bug Type Double dans Access 2007
    Par kurkaine dans le forum C++Builder
    Réponses: 1
    Dernier message: 11/07/2007, 17h35
  5. Bug C++ Builder 6 ? - "while" et doubles
    Par majke dans le forum C++Builder
    Réponses: 18
    Dernier message: 25/10/2006, 12h05

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