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 :

Instanciation automatique d'objets


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 49
    Par défaut Instanciation automatique d'objets
    Bonjour,

    Je cherche à instancier un nombre variable d'objets selon le contenu d'un fichier texte, je m'explique. D'un coté, j'ai mon fichier texte qui possède un format tel que suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    NomClasse1
    Argument1DuPremierObjet,Argument2DuPremierObjet|Argument1DuSecondObjet,Argument2DuSecondObjet|
     
    NomClasse2
    Argument1DuPremierObjet|Argument1DuSecondObjet|
    C'est grandement simplifié, mais il faut comprendre que dans le fichier texte, on a nombre fixe de classes et un nombre d'arguments variables en fonction de la classe.

    Mon objectif est tout simplement d'instancier tous les objets d'une classe passée en paramètre à une fonction "LireFichier(String nomFichier, String nomClasse)".

    Cette procédure cherche dans le fichier la classe passée en paramètre, et découpe ensuite la ligne qui suit la classe avec StringTokenizer(). Tout cela, je l'obtiens, j'obtiens ce que je désire en affichage (par exemple pour NomClasse2, jobtiens deux tokens, le premier "Argument1DuPremierObjet", le second "Argument2DuSecondObjet").

    Maintenant, je voudrais automatiser la création des objets à partir de tout ça. J'ai tenté quelque chose du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int cptTokens=0;
    ligne=tampon.readLine();
    StringTokenizer st = new StringTokenizer(ligne,"|");
     
    while((st.hasMoreTokens()) && (cptTokens<st.countTokens()))
         nomClasse g+cptTokens= new nomClasse(st.nextToken());
    Mais ca ne fonctionne pas, logique, il ne trouve aucune référence à nomClasse par exemple.

    Auriez vous une idée, si vous m'avez compris (), pour automatiser tout cela ? Pour donner un exemple concret :

    On a dans le fichier les classes Port et Bateau. Un port est composé d'une ref et d'un nom, un bateau d'un ID et d'un nom, et disons... une capacité en m3. On veut créer 1 port, et 2 bateaux. Le fichier texte "donnees.txt" aura donc une tête qui ressemble à ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Port
    1,"Nantes"|2,"Le Havre"|
    Bateau
    1,"Bateau1",50000|2,"Bateau2",20000|
    Donc en gros, je voudrais un code qui me permette, en faisant appel dans un premier temps à LireFichier("donnees.txt", "Port"), me crée un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Port P1= new Port(1, "Nantes");
    Port P2= new Port(2, "Le Havre");
    Vouala, désolé de faire si long... Mais j'aime à être clair
    Merci bcp pour votre aide

  2. #2
    Membre Expert
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Par défaut
    As-tu essayé après avoir récupérer le nom de la classe de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Class.forName(LaClasseRécupérée).newInstance()
    ?
    mais bon tes classes doivent posseder un constructeur sans arguments, et aussi des setters pour modifier les attributs des objets créées.
    je ne suis pas sùr que c'est la meilleur façon de faire.
    Je te tiens au courant si j'ai une meilleure idée


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  3. #3
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 49
    Par défaut
    Non je n'y ai pas pensé, et je l'ai vu en regardant la première page du fofo

    Bref, entre temps, j'ai réfléchi à une autre solution... car meme en faisant avec celle que tu viens de me donner, une fois que j'aurai instancié mes x objets, je suppose en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nomInstanceCPT=Class.forName(LaClasseRécupérée).newInstance()
    Si j'ai x instances, je peux tjs pas faire varier le compteur de ma variable CPT dans le nom de l'instance, nan ?

    Donc sinon, j'ai crée une collection des objets que j'instancie à l'aide du code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while((st.hasMoreTokens())) {
         if (nomClasse=="Port")
             collec.add(new Port(Integer.valueOf(st.nextToken()).intValue(),st.nextToken()));
         if (nomClasse=="Bateau") etc....
    }
    ... mais c bcp plus lourd, car il faut que je vérifie à chaque fois si c'est une collection de PORT ou de BATEAU, pour rester dans mon super exemple de tout à l'heure, donc ca fait du if en cascade, et comme j'ai près de 15 classes, c'est très laid

  4. #4
    Membre Expert
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Par défaut
    Si j'ai x instances, je peux tjs pas faire varier le compteur de ma variable CPT dans le nom de l'instance, nan ?
    En java, on ne peut pas avoir de noms de variables dynamique


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  5. #5
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 49
    Par défaut
    Oué donc ca ne résoud pas mon problème, du coup je garde la seconde solution, et je vais m'arranger avec. Merci encore

  6. #6
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Citation Envoyé par moulette85
    Oué donc ca ne résoud pas mon problème, du coup je garde la seconde solution, et je vais m'arranger avec. Merci encore
    Sinon, tu peux t'inspirer du design pattern Abstract Factory :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    public interface Factory {
      String getName();
      Object newInstance(String[] params);
    }
     
    class PortFactory implements Factory {
      public Object newInstance(String[] params) {
        return new Port(Integer.valueOf(params[0]).intValue(), params[1]);
      }
     
      public String getName() {
        return "Port";
      }
    }
     
    class BateauFactory implements Factory {
      public Object newInstance(String[] params) {
        return new Bateau(...);
      }
     
      public String getName() {
        return "Bateau";
      }
    }
     
    class FactoryCollection {
      private Map factories;
     
      public FactoryCollection() {
        factories = new HashMap();
        add(new PortFactory());
        add(new BateauFactory());
        ...
      }
     
      public void add(Factory factory) {
        factories.put(factory.getName(), factory);
      }
     
      public Factory forName(String name)
          throws InvalidArgumentException {
        Factory factory = (Factory) factories.get(name);
        if (factory == null) {
          throw new InvalidArgumentException("factory not found : " + name);
        }
        return factory;
      }
     
      public Object newInstanceForName(String name, String[] params) {
        return forName(name).newInstance(params);
      }
    }

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

Discussions similaires

  1. Instanciation automatique des objets dans les formulaires
    Par vincent7894 dans le forum Spring Web
    Réponses: 2
    Dernier message: 21/02/2012, 09h58
  2. instanciation d'un objet
    Par genius_.net dans le forum Langage
    Réponses: 6
    Dernier message: 05/06/2006, 21h35
  3. [c#]instanciation d'un objet dans la mainform
    Par fafa139 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 04/06/2006, 22h22
  4. [POO] imposer une instanciation d'un objet
    Par zenzo dans le forum Langage
    Réponses: 5
    Dernier message: 16/03/2006, 02h08
  5. [VB6][DoVerb]Lancer automatiquement un objet OLE
    Par Argonz dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 06/11/2002, 13h29

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