Un new sur un generique

Résolu
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 15 mai 2008 à 22:07
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 - 18 mai 2008 à 13:26
Salut

j'ai un generique : <E> et je veux faire une fabrique d'elements de E

j'ai tente un new E();

j'ai tente :

public E factory() throws java.lang.InstantiationException, java.lang.IllegalAccessException{
E ob=null; return (E) ob.getClass().newInstance();
}

mais ca part en nullpointeurException

En Cpp, j'aurais juste eu a faire un new E(); mais la, je bloque...
Si quelqu'un a la solution :)

Merci d'avance

18 réponses

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
16 mai 2008 à 09:42
Salut,

je sais pas trop si ça va correspondre à ce que tu veux mais voici une solution :
(prise 5279712&tstart=-1 ICI)
 import  java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
 


publicfinalclass GenericInstantiator {
public <T> T makeInstance(Class<T> c) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException {
T instance =   null ;
 
Class[] emptyParams  = {};
Constructor<T> con =  c.getDeclaredConstructor(emptyParams);
con.setAccessible( true );

instance  = con.newInstance();
 
return instance;
}
}


------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
3
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
16 mai 2008 à 17:57
twinuts, j'avais pas vu ce matin : tu passes :
Class<T> c


en parametre c'est justement ce que je voulais eviter, daedric m'avait bien aide a trouver cette solution, mais elle ne me plaisait pas trop (parce-que ca fait une redondence, on met T deux fois quand on appelle la classe... bref)

public class JsonCollection<E extends JsonAble>{
...
    Class classe;
...
    public E factory() throws java.lang.InstantiationException, java.lang.IllegalAccessException{
        return (E)classe.newInstance();
    }
    public JsonCollection(... Class c) throws ...{
 ....
            classe = c;
...
}
}

pour l'appel, ca donne un truc genre :

 JsonCollection<Etudiant> ets=new JsonCollection<Etudiant>(...Etudiant.class);

et tu vois, j'utilise deux fois Etudiant (en plus du type)
3
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
16 mai 2008 à 19:38
ca me rassure je dis pas que de la merde :p

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
3
indiana_jules Messages postés 750 Date d'inscription mardi 9 mars 2004 Statut Membre Dernière intervention 23 décembre 2008 22
16 mai 2008 à 08:46
Salut
ne faudrait-il pas plutot qu'en sortit de ta fonction, le type soit : <? extends E>
De plus, tu fais un 'E ob = null', et tu appelles une fonction dessus !!! (D'où nullPointerException)

A mon avis, c'est plutôt: NomDeMaClasseGeneriqueQuiNeSoitPasUneInterface.getClass().newInstance();

Voili voilà

le monde a des idées : la preuve, c'est qu'il y en a de mauvaises
ne comprends pas tout, mais je parle de tout : c'est ce qui compte
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
16 mai 2008 à 10:46
indiana_jules, cette solution appelle une methode oui, mais statique (enfin je crois, ou si elle ne l'est pas, elle n'utilise pas this...) bref, en Cpp et en delphi, ca aurait marche...

twinuts, je vais tester ca des que possible :)

pour le moment, je m'en suis sorti en passant une Class en parametre, c'est moche, mais ca fonctionne.

Bref, j'achete une barette de ram et je teste ca :)
0
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
16 mai 2008 à 12:27
Salut,

Je ne vois pas de possibilité pour avoir une usine pour tous les objets possibles. Une usine est dédiée à la fabrication d'objets d'un certain type ou dérivant d'un certain type. Enfin je me trompe peux être.

Voici un exemple d'usine qui délègue la fabrication d'objet à la classe qui l'utilise (usine abstraite) :

/**
 * Usine abstraite pour objet issue d'une base de données
 *
 * @param <T>
 */
import java.sql.ResultSet;

import java.sql.SQLException;


public abstract class  Factory<T>{

    /**
     * la création d'un objet à partir d'un ResultSet est délégué à la classe utilisatrice
     * Seule la classe utilisatrice sait comment fabriquer un objet à partir des champs du ResultSet
     *
     * @param resultSet
     * @return
     * @throws SQLException
     */
    public abstract T create(ResultSet resultSet) throws SQLException;
   
}

/**
 * Classe utilisatrice de l'usine Factory
 *
 */
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class MyObject{
   
    private final Integer myInt;
    private final Integer myString;
   
    /**
     * La construction de l'objet a lieu au sein de la classe,
     * car elle seule sait comment fabriquer un objet à partir des champs du ResultSet
     *
     * @param resultSet
     * @throws SQLException
     */
    private MyObject(final ResultSet resultSet) throws SQLException {
        this.myInt = resultSet.getInt("myInt");
        this.myString = resultSet.getInt("myString");
    }
   
    /**
     * L'usine à objet de la classe
     * Elle definit le create à partir du constructeur privé de la classe qui utilise le ResultSet
     *
     */
    private static final Factory<MyObject> myObjectFactory = new Factory<MyObject>(){
        @Override
        public MyObject create(ResultSet resultSet) throws SQLException{
            return new MyObject(resultSet);
        }
    };
   
    public String toString() {        return "myInt " + this.myInt + " myString " + this.myString;
    }
   
    public static void main(final String[] args){
       
        final int someId = 1;
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        MyObject object = null;
        try{
            connection=java.sql.DriverManager.getConnection("jdbc:mysql://hostname:port/database?user=myUser&password=myPassword");
            statement = connection.createStatement();            resultSet statement.executeQuery("SELECT myInt, myString FROM myTable where myId " + someId);
            object = myObjectFactory.create(resultSet);
        }
        catch(final SQLException e){
            e.printStackTrace();
        } finally {
            if (resultSet != null) try{
                resultSet.close();
            if (statement != null)
                statement.close();
            if (connection != null)
                connection.close();
            }
            catch(final SQLException e){
                e.printStackTrace();
            }
        }
        if (object != null)
            System.out.println(object);
    }
}
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
16 mai 2008 à 12:48
quand tu dis : "Une usine est dédiée à la fabrication d'objets d'un certain type ou dérivant d'un certain type."
bah dans mon cas, elle fait des <E>...
En Cpp, ca passe sans probleme, mais les generiques en java ont pas mal de retard sur ceux du Cpp
0
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
16 mai 2008 à 14:20
Ok c++ est plus ancien, mais son modèle objet est trop spaghetti (héritage multiple, pas de classe mère (Object)...). Le mécanisme des patrons de classe était certes joli, mais plus difficile à maintenir.
Ok java est encore jeune (et encore ça se discute), mais il n'y a aucune raison pour qu'il existe de modèle absolu de fabrication des objets dont pas de raison qu'il existe un modèle absolu des usines à objet.
Regarde aussi le modèle objet de javascript (héritage par prototype et non par classe => héritage dynamique). Mécanisme que ni c++ ni java ne sont capables de proposer (faire changer la hiérarchie de classe d'un objet en cours d'execution, c'est fort quand même !!). Certains parlent même de AOP (Aspect Oriented Programming), une extension de l'OOP. Le modèle objet n'est pas figé, les langages évolueront en fonction des nouvelles propositions. Java suit sa route...

Faire des <E> ou des <? extends E> au sens large est plutôt utopique. Ton programme devrait prendre en compte la totalité des cas de E et pour faire simple il y en a une ... infinité...
0
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
16 mai 2008 à 14:30
La solution de Twinuts part du principe que tout les objets ont un constructeur sans arguments. Qui a décrété que toutes les classes avait forcément ce type de constructeur.
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
16 mai 2008 à 19:50
Salut,

bah le problème c'est que comme dit plus haut, java n'est pas aussi mature que le C++ donc paye tes limitations...

[auteur/ALEXN/638418.aspx AlexN]> "Qui a décrété que toutes les classes avait forcément ce type de constructeur."
>> Personne mais si tu veux perdre du temps (monstre) tu peux faire de l'introspection sur les différents constructeurs de ton objet...
Puis bon rien ne t'empeche de fixer des restrictions sur tes codes...

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
16 mai 2008 à 20:05
pour mon cas, daedric m'avait donne la meme astuce (que je ne conaissais donc pas) sur le extends (d'ailleur, j'ai pas trop compris pourquoi implements ne marche pas dans ce cas...)

en fait, la classe que je vous ai  montre, c'est une classe qui permet de loader des donnees json dans une autre classe... l'autre classe implements JsonAble, donc je peux poser une contrainte sur le constructeur.

tsais, la norme de Cpp a 10 ans, donc le langage ok il est mature, mais il evolue lentement, et on utilise des choses qui n'etaient pas si matures que ca a l'epoque... De plus, java s'inspirant de Cpp aurait pu prendre ce qu'on y trouve de meilleur.

Mais bon, j'utilise java parce-que c'est marrant et utile et j'ai pas envie d'en troller, quand je vois un truc incoherent ou pas super par rapport a d'autres langages, je le note, c'est tout... (apres, si vous voulez troller java doit-il vivre ou mourrir, vous pouvez aller sur le site du zero, vous cherchez ceux qui ont les cheveux longs et qui programment en fonctionnel : ocaml, haskell, erlang, lisp, scala, ceux qui parlent le lojban, etc... certains ont un bon niveau, et crachent vraiment sur le java...)

moi si j'avais vraiment qqch d'important contre le java, je ne serais pas ici, et j'aurais pas fait ce truc en java... (c'etait un projet personnel)

Bref, mon probleme est resolu, et je crois que ca ne sert plus a rien de pousser le sujet java vs autres_langages, (j'avais parle de Cpp parce-que, ca peut aider a comprendre le probleme, c'est tout). On est tous ici parce-qu'on trouve une certaine utilite au langage java (ou a la jvm), et c'est ce qui compte.
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
16 mai 2008 à 20:14
Salut,

bah vu ce que je pense de plus en plus de sun (je généralise jusqu'aux dev de sun), je ne serai pas contre une séance de trolling ^^

fin bon java reste java, c'est bien quand tu veux faire des choses simple, mais des que tu commences à dépasser le cadre normal de son utilisation....c'est vite le drame...

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
16 mai 2008 à 20:37
on a les memes soucis en php, et avec les ventilateurs (daedric peut confirmer, un ventilateur, quand on lui passe de l'eau et du savon, ca peut vite virer au drame XD cf prologin)
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
17 mai 2008 à 08:47
mais heuuuuu !!!!
ca nettois d'abord :p mais l'annee prochaine je t'y mets de dedans de gres ou de force ^^

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
17 mai 2008 à 09:23
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
<title>
</title>
<meta name="GENERATOR" content="OpenOffice.org 2.3 (Linux)" />
<style type="text/css">
<!--
@page { size: 21cm 29.7cm; margin: 2cm }
P { margin-bottom: 0.21cm }
-->
</style>
Salut,

je ne sais pas pourquoi
mais je ne suis pas surpris.... c'est du thom tout craché
ça... (en plus des heures de cours...heuuu scuse des heures de
colles ^^)











------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
18 mai 2008 à 13:19
gnagnagna ^^ en attendant on a eut 21 pour un tetris en termcaps, gestion pafaite du rezise

on a perdu deux points parce ce qu'on trappais pas les signeaux de kill et donc on remettez pas la line discipline correctement

et de\ux point pour deux petit bug


donc au final 17 :p

jposterais les sources sur cppfrance je pense ^^

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
18 mai 2008 à 13:24
Salut,

tu vas lui rajouter des commentaires à ta source ? (huhu ^^)

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
18 mai 2008 à 13:26
nan les noms sont explicite :p

puis c'est du pure systeme si il connais pas une fonction : man fonction :p

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
0
Rejoignez-nous