Créer un objet sans passer par new

madiou25 1 Messages postés vendredi 20 mai 2016Date d'inscription 20 mai 2016 Dernière intervention - 20 mai 2016 à 15:30 - Dernière réponse : CS-Tual 15 Messages postés mercredi 25 mai 2011Date d'inscription 20 mai 2016 Dernière intervention
- 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();
  }
 }

}
Afficher la suite 

Votre réponse

2 réponses

KX 15739 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 25 septembre 2018 Dernière intervention - 20 mai 2016 à 16:33
0
Merci
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);
}
Commenter la réponse de KX
CS-Tual 15 Messages postés mercredi 25 mai 2011Date d'inscription 20 mai 2016 Dernière intervention - Modifié par CS-Tual le 20/05/2016 à 16:47
0
Merci
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.
Commenter la réponse de CS-Tual

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.