Créer un objet sans passer par new

madiou25 Messages postés 1 Date d'inscription vendredi 20 mai 2016 Statut Membre Dernière intervention 20 mai 2016 - Modifié par KX le 20/05/2016 à 16:04
CS-Tual Messages postés 15 Date d'inscription mercredi 25 mai 2011 Statut Membre Dernière intervention 20 mai 2016 - 20 mai 2016 à 16:38
Bonjour, j'essaie d'instancier ma classe sans le new mais j'ai un blocage que je n'arrive pas à surmonter. Quelqu'un pourrait-il m'aider? merci d'avance.
Voici mon code::
public class Paire {
 protected String valeur1;
 protected String valeur2;

 public String getValeur1() {
  return valeur1;
 }

 public void setValeur1(String valeur1) {
  this.valeur1 = valeur1;
 }

 public String getValeur2() {
  return valeur2;
 }

 public void setValeur2(String valeur2) {
  this.valeur2 = valeur2;
 }

 @Override
 public String toString() {
  return "Je suis un objet qui a pour valeur : " + this.valeur1 + " - "
    + this.valeur2;

 }

 public void Paire(String val1, String val2) {
  this.valeur1 = val1;
  this.valeur2 = val2;
  System.out.println("Instanciation avec des paramètres !");
 }

 public void Paire() {
  this.valeur1 = null;
  this.valeur2 = null;
  System.out.println("Instanciation !");
 }

 public static void main(String[] args) {
  String nom = Paire.class.getName();
  try {
   // On crée un objet class
   Class c = Class.forName(nom);
   // Nouvelle instance de la classe Paire
   Object o = c.newInstance();

   // On crée les paramètres de la classe
   Class[] types = new Class[] { String.class, String.class };
   // On recupère le constructeur avec les paramètres
   Constructor ct = c.getConstructor(types);
   // on instancie l'objet avec le constructeur
   Object o2 = ct.newInstance(new String[] { "valeur 1", "valeur 2" });
  } catch (ClassNotFoundException e) {
   System.err.println("la création de l'objet Class a échouée!!!");
  } catch (InstantiationException e) {
   System.err
     .println("Echec de l'instanciation de la classe Paire!!!");
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (NoSuchMethodException e) {
   System.err
     .println("Nous n'avons pas recupérer le constructeur avec les paramètres");
  } catch (SecurityException e) {
   System.err.println("Attention, il y a violation de la sécurité!!");
  } catch (IllegalArgumentException e) {
   System.err
     .println("Impossible d'instancier l'objet avec les paramètres");
  } catch (InvocationTargetException e) {
   e.printStackTrace();
  }
 }

}

2 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127
20 mai 2016 à 16:33
Bonjour,

Un constructeur ne doit pas avoir de type de retour, sinon c'est une méthode normale.

Donc ceci est faux :
public class Paire {
    public void Paire(String val1, String val2) {
    }
    public void Paire() {
    }
}

Il faut enlever les void :
public class Paire {
    public Paire(String val1, String val2) {
    }
    public Paire() {
    }
}

Mais sinon ton code fonctionne, il te manque quand même les affichages de o et o2 pour vérifier que ça marche.

Toutefois ton code est un peu compliqué, voici comment le simplifier.

public static void main(String[] args) {
    try {
        Paire p = Paire.class.newInstance();
        System.out.println(p);
    } catch (Exception e) {
        e.printStackTrace();
    }

    try {
        Paire p = Paire.class.getConstructor(String.class, String.class).newInstance("valeur1", "valeur2");
        System.out.println(p);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Remarque : en Java 8 on peut faire des références de méthode avec les constructeurs ce qui donne une autre manière de faire de l'instanciation d'objet, plus efficace qu'avec la réflexion.

public static void main(String[] args) {
    // import java.util.function.Supplier;
    Paire p1 = ((Supplier<Paire>) Paire::new).get();
    System.out.println(p1);

    // import java.util.function.BiFunction;
    Paire p2 = ((BiFunction<String, String, Paire>) Paire::new).apply("valeur1", "valeur2");
    System.out.println(p2);
}
0
CS-Tual Messages postés 15 Date d'inscription mercredi 25 mai 2011 Statut Membre Dernière intervention 20 mai 2016
Modifié par CS-Tual le 20/05/2016 à 16:47
Salut,

Tu as mal déclaré tes constructeurs.

La signature d'un constructeur ne doit pas comporter le mot clé "void".

Voici les bonnes signatures pour tes constructeurs

public Paire(String val1, String val2) {
  this.valeur1 = val1;
  this.valeur2 = val2;
  System.out.println("Instanciation avec des paramètres !");
 }

 public Paire() {
  this.valeur1 = null;
  this.valeur2 = null;
  System.out.println("Instanciation !");
 }


A+,
Tual.
0
Rejoignez-nous