p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Membre chevronné Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    octobre 2012
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : octobre 2012
    Messages : 374
    Points : 602
    Points
    602

    Par défaut Utilisation de la classe Class

    Bonjour à tous,

    j'ai un soucis avec l'utilisation de Class. J'ai besoin , je pense, de passer un paramètre à la méthode .newIntance(). Je vous donne le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	public void afficheObjet(Class<?> classe, int col, int lig) throws InstantiationException, IllegalAccessException{
     
    		classe.newInstance();
     
    		Zone crt = listZones.get(col+(lig-1)*dim);
    		crt.setOccupe(true);
    		crt.setImageFond(classe.getName());
    		crt.repaint();
     
     
    	}
    Mon problème c'est que les classes instanciées ont toute au moins un paramètre à prendre en compte, et que je ne comprend pas comment lui dire quels sont les paramètres du constructeur...

    Et tant que j'y suis, vaut-il mieux utiliser le throws ou un multi Try/catch? Je ne saisi pas bien les conséquences du choix...

  2. #2
    Modérateur

    Inscrit en
    septembre 2004
    Messages
    10 437
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 10 437
    Points : 17 453
    Points
    17 453

    Par défaut

    Citation Envoyé par Cafeinoman Voir le message
    Mon problème c'est que les classes instanciées ont toute au moins un paramètre à prendre en compte, et que je ne comprend pas comment lui dire quels sont les paramètres du constructeur...
    newInstance() ne peut appeler que le constructeur sans paramètre (en supposant qu'il y en ait un. Sinon, newInstance() ne marche pas et c'est marre.)

    Pour les constructeurs avec paramètre, il faut récupérer le Constructor correspondant, et s'en servir.

    La FAQ n'en parle pas, alors voici un petit exemple :

    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
    public class Person {
      private final int age;
      // un seul constructeur, et il prend un int en paramètre
      public Person(int age) {
        this.age = age;
      }
      public int getAge() {
        return age;
      }
     
      // Essayons d'en instancier un avec Class.
      public static void main(String[] args) throws Exception {
        Class<?> clazz = Person.class;
     
        // Récupérer le Constructor
        Constructor<?> constructor = clazz.getConstructor(Integer.TYPE);
        // Un paramètre de type int se demande avec Integer.TYPE
     
        // Appel du constructeur avec un paramètre
        Object object = constructor.newInstance(27);
     
        // On vérifie que c'est ce qui était demandé
        Person person = (Person)object;
        System.out.println(person.getAge());
      }
    }
    Citation Envoyé par Cafeinoman Voir le message
    Et tant que j'y suis, vaut-il mieux utiliser le throws ou un multi Try/catch? Je ne saisi pas bien les conséquences du choix...
    Question de point de vue, mais le mien c'est que ces exceptions n'ont pas besoin d'être déclarées.
    Normalement elles sont le résultat d'une erreur de programmation, elles ne dépendent que des programmeurs, qui n'ont pas respecté leurs propres conditions d'utilisation : la classe doit être une classe concrète, l'accès à ses constructeurs doit être autorisé.
    Du coup elles n'arriveront que tant qu'il y aura erreur de programmation, et pas ensuite. Elles ne peuvent arriver que pendant les phases de tests, pas plus tard.

    Du coup je les choperais toutes dans des catch(), qui masquerait ces exceptions dans une exception non déclarée, comme IllegalStateException (parce que avoir pris une classe ou un constructeur qui répond pas aux conditions, c'est un état inattendu et invalide) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    } catch(IllegalAccessException e) {
      throw new IllegalStateException(e.getMessage(), e);
    }
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher du poisson, il videra le lac et au bout de deux ans son village ne mangera plus jamais.
    Partagez vos connaissances, mais aussi comment s'en servir.

  3. #3
    Membre chevronné Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    octobre 2012
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : octobre 2012
    Messages : 374
    Points : 602
    Points
    602

    Par défaut

    Merci! Je me doutais qu'il fallait passer par le constructeur, mais je n'arrivais pas à formuler la chose...

    Reste un problème avant de passer en résolu : comment faire pour que le nombre et le type de paramètres soit défini soient trouvés tout seul? En admettant bien sur que leur valeur est défini de manière aléatoire, ou qu'on appel des boîtes de dialogue au fur et à mesure...

  4. #4
    Expert Confirmé Sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    22 908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 22 908
    Points : 43 530
    Points
    43 530

    Par défaut

    Tu peux utiliser Class.getConstructors() pour avoir tous les constructeur et les analyser si t'as besoin de savoir dynamiquement ce qui existe.
    "Tchize is always good. Tchize is just milk’s attempt at being immortal"
    faq java, cours java, javadoc. Pensez à et

  5. #5
    Membre chevronné Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    octobre 2012
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : octobre 2012
    Messages : 374
    Points : 602
    Points
    602

    Par défaut

    Tout simplement...

    Je passe en résolu, merci!

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

Discussions similaires

  1. ArrayList<Class> class class.setString()
    Par Onelove dans le forum Débuter
    Réponses: 2
    Dernier message: 31/08/2014, 19h42
  2. Réponses: 5
    Dernier message: 22/01/2006, 09h10
  3. débutant:utilisation de variable entre classe
    Par troojan dans le forum MFC
    Réponses: 1
    Dernier message: 07/12/2005, 23h31
  4. utiliser mysql++ dans une classe
    Par Yevetrovitch dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 11/04/2005, 10h53
  5. Utilisation iterator avec une classe perso
    Par SteelBox dans le forum C++
    Réponses: 19
    Dernier message: 07/03/2005, 11h30

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