Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Membre éclairé Avatar de Cafeinoman
    Homme Profil pro François Delalleau
    Auditeur CNAM
    Inscrit en
    octobre 2012
    Messages
    240
    Détails du profil
    Informations personnelles :
    Nom : Homme François Delalleau
    Âge : 27
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Auditeur CNAM

    Informations forums :
    Inscription : octobre 2012
    Messages : 240
    Points : 398
    Points
    398

    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 :
    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
    9 530
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 9 530
    Points : 14 359
    Points
    14 359

    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 :
    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 :
    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 éclairé Avatar de Cafeinoman
    Homme Profil pro François Delalleau
    Auditeur CNAM
    Inscrit en
    octobre 2012
    Messages
    240
    Détails du profil
    Informations personnelles :
    Nom : Homme François Delalleau
    Âge : 27
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Auditeur CNAM

    Informations forums :
    Inscription : octobre 2012
    Messages : 240
    Points : 398
    Points
    398

    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
    Responsable de service informatique
    Inscrit en
    avril 2007
    Messages
    21 350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Service public

    Informations forums :
    Inscription : avril 2007
    Messages : 21 350
    Points : 35 099
    Points
    35 099

    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 (Чиз) faq java, cours java, javadoc. Pensez à et
    Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.

  5. #5
    Membre éclairé Avatar de Cafeinoman
    Homme Profil pro François Delalleau
    Auditeur CNAM
    Inscrit en
    octobre 2012
    Messages
    240
    Détails du profil
    Informations personnelles :
    Nom : Homme François Delalleau
    Âge : 27
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Auditeur CNAM

    Informations forums :
    Inscription : octobre 2012
    Messages : 240
    Points : 398
    Points
    398

    Par défaut

    Tout simplement...

    Je passe en résolu, merci!

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •