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 :

Instancier une classe aléatoirement


Sujet :

Java

  1. #1
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2009
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 194
    Par défaut Instancier une classe aléatoirement
    Bonjour à tous,

    j'aimerais savoir si il est possible d'instancier une classe de façon aléatoire.

    Typiquement, j'ai deux classes A et B, et je voudrais qu'une autre méthode choisisse aléatoirement entre A et B, et en instancie x objets.
    Est-ce possible ? Si oui, de quelle manière propre y parvenir.

    Merci beaucoup.

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Oui, c'est possible, c'est plus ou moins simple en fonction de la présence d'un constructeur sans arguments ou avec.

    Pour le cas le plus simple, il suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Class.forName("nom_qualifié_de_classe").newInstance()
    Dans le cas le plus compliqué, il faudra utiliser l'introspection de ta classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Constructor<UneClasse> cst = UneClasse.class.getConstructor(Integer.class, String.class);
    Object[] initArgs = new Object[]{125, "TEST"};
    cst.newInstance(initArgs);
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    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
    Salut,

    Pourquoi pas simplement :

    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 Object[] genere(int x) {
          Object[] array = new Object[x];
     
          if ( Math.random()<0.5 ) {
             for(int i=0; i<x; i++) {
                 array[i] = new A();
             }
          }
          else {
             for(int i=0; i<x; i++) {
                 array[i] = new B();
             }
          }
     
         return array;
     
    }
    Eventuellement, si A et B étende une même classe, autre que Object, tu peux spécialiser le tableau.
    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.

  4. #4
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2009
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 194
    Par défaut
    Merci de vos réponses.

    En continuant de chercher, je suis effectivement tombé sur les forName(). Intéressant mais gourmand en ressource apparemment. Je vais m'y pencher, je pense que la solution est lá, lourde mais au moins existante

    Pourquoi pas de if ? tout simplement parce que dans mon exemple je n'ai que deux classes, mais je suis amené a en avoir bien plus, et les if else deviendraient ingérables.

    Merci beaucoup en tous cas, je ne connaissais pas cette façon de faire,encore une preuve de la puissance de Java

  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 delta07 Voir le message
    Pourquoi pas de if ? tout simplement parce que dans mon exemple je n'ai que deux classes, mais je suis amené a en avoir bien plus, et les if else deviendraient ingérables.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private final static Random RANDOM = new Random();
    public Object[] genere(int x, Class<?>...classes) {
       Object[] array = new Object[x];
     
       int indexClass = RANDOM.nextInt(classes.length);
       for(int i=0; i<x; i++) {
          try {
             array[i] = classes[indexClass].newInstance(); // si tu as des paramètres pour le constructeur, ça peut être plus complexe, surtout si le nombre et le type est différent pour chaque classe
          } catch (InstantiationException | IllegalAccessException e) {
             throw new RuntimeException(e);
          }
       }
       return array;
    }
    Qu'on peut appeler comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object[] array = genere(10, A.class, B.class, C.class, D.class);
    Le Class.forName() c'est si les noms de tes classes sont des chaînes de caractères, par exemple lues depuis un fichier de configuration.
    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.

  6. #6
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2009
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 194
    Par défaut
    Effectivement, c'est peut être plus adapté. Et ça éviterai de devoir faire une Liste avec les noms des Classes dedans. Je vais voir ça

  7. #7
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2009
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 194
    Par défaut
    j'ai juste du mal a comprendre ça Ça permet de mettre autant de paramètre que l'on veut dans la méthode ? Car j'ai une erreur, il me dit de créer une methode avec les paramètres exacts.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object[] array = genere((int) nombre, A.class, B.class);
    The method genere(int, Class<Object>...) in the type Construct is not applicable for the arguments (int, Class<A>, Class<B>)

  8. #8
    Membre Expert Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Par défaut
    Citation Envoyé par delta07 Voir le message
    j'ai juste du mal a comprendre ça Ça permet de mettre autant de paramètre que l'on veut dans la méthode ?
    Effectivement, on appelle ça une ellipse.

    Cela permet de passer autant de paramètres que l'on veux (même zéro) lors de l'appel à la méthode.
    Tu récupères ensuite ces paramètres sous forme d'un tableau dans le corps de ta méthode.

    En tout cas le code donné par @joel.drigo marche très bien.. Tu utilises quoi comme version de Java ?

    Cdt.

  9. #9
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2009
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 194
    Par défaut
    J'ai récupéré le code de joel.drigo, et ça marche du tonnerre. J'ai un peu adapté à ma sauce évidemment, mais j'ai beaucoup appris grace à cette question. Merci beaucoup à vous.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/05/2006, 19h05
  2. [JAR]Instancier une classe d'un jar
    Par Foub dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 16/08/2005, 15h10
  3. Réponses: 3
    Dernier message: 13/08/2005, 15h18
  4. [Débutant(e)]Instancier une classe connaissant son nom (String)
    Par Invité dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 17/06/2005, 11h05
  5. [Débutant(e)]servlet qui instancie une classe personelle
    Par NiBicUs dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 08/02/2005, 12h00

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