template c++ -> Java

template c++ -> Java - Java - Programmation

Marsh Posté le 26-03-2008 à 15:37:19    

Bonjour,
 
je suis amenee pour mon projet a traduire des classes c++ en java.
je ne suis pas une pro ni en java ni en c++
 
voila la classe que je dois traduire :
C++

Code :
  1. template <class T>
  2. struct SingletonCreator
  3. {
  4.    SingletonCreator() { T::instance(); }
  5.    inline void dummy() const { ; }
  6. };


 
voila comment je l'ai traduit
java

Code :
  1. public class SingletonCreator<T> {
  2. <T>SingletonCreator() { instance(); }
  3. public void dummy() { ; }
  4. }


 
j'utilise eclipse pour developper et il me souligne instance(); , j'ai essaye de mettre plusieurs trucs dont <T>.instance(); mais je n'arrive pas a trouver la solution
 
j'ai le message d'erreur suivant  

Citation :

The method instance() is undefined for the type SingletonCreator<T>


 
je vous remerci d'avance pour votre aide
 
Naya

Reply

Marsh Posté le 26-03-2008 à 15:37:19   

Reply

Marsh Posté le 04-04-2008 à 23:02:00    

Bah normal t'as une classe dans laquelle tu appelle une méthode instance() qui n'existe pas.
 
En plus ca ne sert a rien de mettre un ";" dans une méthode ou aucun code n'est écrit.
 
De plus tu n'as pas de constructeur dans ta classe (A part celui hérité d'object).
 
Sinon un lien sur la différence entre template et type generics http://lroux.developpez.com/articl [...] esGenerics
 
Pour le reste je ne comprend pas le C++ donc je ne peux t'être d'une grande aide.

Reply

Marsh Posté le 05-04-2008 à 10:19:33    

Anonymouse a écrit :


De plus tu n'as pas de constructeur dans ta classe (A part celui hérité d'object).


 
Apparemment tune sais pas ce qu'est un singleton non plus  :sarcastic:

Reply

Marsh Posté le 05-04-2008 à 10:31:00    

Joel F a écrit :


 
Apparemment tune sais pas ce qu'est un singleton non plus  :sarcastic:


 
Singleton permet de n'avoir qu'une seul instanciation d'objet.
En quoi ta remarque est pertinente?
 
De plus je ne sais pas comment tu implémente le design pattern singleton mais sans variable static et sans constructeur tu dois avoir une méthode bien spécial pour le faire.
 

Code :
  1. public class SingletonCreator
  2. {
  3. public static SingletonCreator singleton;
  4. private SingletonCreator() {
  5. }
  6. public static SingletonCreator getSingleton()
  7. {
  8.  if(singleton==null)
  9.  {
  10.   singleton=new SingletonCreator();
  11.  }
  12.  return singleton;
  13. }
  14. public static void main(String[] args) {
  15.  SingletonCreator a=SingletonCreator.getSingleton();
  16. }
  17. }


 
Bien entendu l'extrait de code ci-dessus ne respecte pas le design pattern singleton en environnement mono-thread et bien entendu il n'as pas de constructeur !!!


Message édité par Anonymouse le 05-04-2008 à 10:38:23
Reply

Marsh Posté le 05-04-2008 à 10:34:57    

bah, ça me semble logique qu'elle n'ai pas de constructeur public en gros

Reply

Marsh Posté le 05-04-2008 à 10:42:10    

Joel F a écrit :

bah, ça me semble logique qu'elle n'ai pas de constructeur public en gros


 
Bah ouais mais faire une classe sans constructeur même privé de cette façon j'en vois pas l'intérêt.
 
De plus ai-je dit: "tu n'as pas de constructeur public" bah nan j'ai dit qu'elle en avait pas.


Message édité par Anonymouse le 05-04-2008 à 11:59:08
Reply

Marsh Posté le 07-04-2008 à 15:58:33    

dans le code c++ initial il n'y a pas non plus de constructeur etc et ca fonctionne apparement.
 
je ne suis pas forte ni en c++ ni en java et donc je galere.  
je ne vois pas comment faire pour que mon singleton fonctionne

Reply

Marsh Posté le 08-04-2008 à 08:53:11    

Comme l'a dit anonymouse il faut que tu déclare une méthode instance


---------------
Instagram - Mon PVT en Australie.
Reply

Marsh Posté le 11-04-2008 à 11:22:36    

Si je peux me permettre, tout ceci n'a guère de sens. En fait, ce n'est pas vraiment traduisible en Java. La manière d'écrire les singletons en Java est nettement plus simple qu'en C++ (même multi-thread-safe ; et en l'occurrence, l'écriture est plus simple que ce qu'a écrit Anonymouse). Elle est tellement simple qu'elle rend inutilement complexe toute tentative de factoriser le code de création du singleton.
 
Si on essaie de le faire quand même, voici ce que ça donne, étape par étape, et on verra là où ça va finir par coincer.
 
Le truc fondamental avec les templates C++, c'est que le compilateur pioche dans le code template pour ne compiler que ce dont il a besoin. Si une classe template n'est pas utilisée, il ne la compile pas. Si une classe template utilisée a une de ses méthodes qui n'est pas utilisée, il ne compile pas cette dernière. Et surtout, on peut faire des suppositions sur les types templates (ici, il existe une méthode instance() sur le type T) sans le dire vraiment. On peut donc tout à fait écrire du code template C++ qui ne compile pas (en tout cas pas tout seul), alors même que le compilateur C++ n'affiche aucune erreur à la compilation.
 
En Java, le compilateur compile toujours l'intégralité des classes génériques. Il vérifie donc la syntaxe de tout leur code. Et en plus, il faut impérativement dire ce qu'on suppose sur les types génériques.
 
Ainsi, si on suppose que le type T possède une opération instance(), il faut écrire un truc du genre :

Code :
  1. interface Singleton<T> {
  2.   T instance();
  3. }
  4. class SingletonCreator<T extends Singleton<T>> { ... }


Le problème ensuite pour traduire ton code de C++ en Java, c'est qu'on se retrouve face à une autre limitation des génériques Java : dans la version C++, l'opération instance() sur T est statique ; c'est donc une opération qui porte sur la classe T elle-même, et non une opération qui porte sur une instance de T.
 
En Java, il n'y a aucun moyen d'exprimer une telle chose : les opérations dans les classes génériques ne peuvent être définies que comme des opérations qui portent sur des instances. Et quand on a un type générique T en Java, on ne peut pas non plus écrire "new T()" ou "T.class"
 
Bref, c'est peut-être possible en utilisant les éléments les plus poussés de l'introspection (package java.lang.reflect), mais je ne connais pas vraiment de moyen de factoriser le code de création d'un singleton. En même temps, y a-t-il vraiment besoin de factoriser ceci (qui est thread-safe) ?

Code :
  1. public class MonSingleton {
  2.     private static final MonSingleton instance = new MonSingleton();
  3.     private MonSingleton() {
  4.         ...
  5.     }
  6.     public static MonSingleton getInstance() {
  7.         return instance;
  8.     }
  9. }


Message édité par BifaceMcLeOD le 11-04-2008 à 11:29:30
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed