philosophie constructeur par recopie / clone

philosophie constructeur par recopie / clone - Java - Programmation

Marsh Posté le 08-02-2003 à 20:28:22    

je suis entrain d'apprendre à bidouiller en Java, et je suis assez surpris, mais cela vient peut etre de mon expérience C++.
 
beaucoup de classes de l'API ne possède ni méthode clone ni constructeur par recopie: par contre, un constructeur admettant une string en param est la. bref pour recopier, c'est à la batarde new MonObjet(unObjet.toString())
 
je sais que les cas ou l'on a besoin de véritable copie ne sont pas forcément fréquents, mais je trouve que les mecs qui ont fait ça ont un peu fait les radins...

Reply

Marsh Posté le 08-02-2003 à 20:28:22   

Reply

Marsh Posté le 08-02-2003 à 20:47:50    

:heink:

Reply

Marsh Posté le 08-02-2003 à 21:04:04    

ben je fais part de mon étonnement

Reply

Marsh Posté le 08-02-2003 à 21:06:15    

exemple ?


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 08-02-2003 à 21:15:27    

j'en ai pas sous la main, je parcours l'API et y en a plein

Reply

Marsh Posté le 08-02-2003 à 21:44:16    

++Taz a écrit :

j'en ai pas sous la main, je parcours l'API et y en a plein


 
j'te parle même pas de certainnes classes de l'API java qui n'implémentent pas l'interface serializable, une honte mon bon monsieur [:tinostar]
 
 
exemple les classes de java.awt.geom; par contre elles implémentent cloneable  [:boidleau]


Message édité par schnapsmann le 08-02-2003 à 21:54:28

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 08-02-2003 à 22:36:26    

Bin et Object.clone() alors ?

Reply

Marsh Posté le 08-02-2003 à 22:45:20    

krosso a écrit :

Bin et Object.clone() alors ?


 

Code :
  1. public interface Cloneable
  2. A class implements the Cloneable interface to indicate to the Object.clone() method that it is legal for that method to make a field-for-field copy of instances of that class.
  3. Invoking Object's clone method on an instance that does not implement the Cloneable interface results in the exception CloneNotSupportedException being thrown.


Message édité par schnapsmann le 08-02-2003 à 22:45:39

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 08-02-2003 à 22:49:54    

En effet...
 

Reply

Marsh Posté le 09-02-2003 à 15:25:49    

++Taz a écrit ca pour faire un clone :

new MonObjet(unObjet.toString())


[:serial coder]

Reply

Marsh Posté le 09-02-2003 à 15:25:49   

Reply

Marsh Posté le 09-02-2003 à 22:03:02    


 
 
+1 [:totoz]


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 10-02-2003 à 00:11:26    


 
*2  [:794]


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 10-02-2003 à 07:23:40    

SchnapsMann a écrit :


 

Code :
  1. public interface Cloneable
  2. A class implements the Cloneable interface to indicate to the Object.clone() method that it is legal for that method to make a field-for-field copy of instances of that class.
  3. Invoking Object's clone method on an instance that does not implement the Cloneable interface results in the exception CloneNotSupportedException being thrown.




 
Ben oui ! C'est normal. Qu'est ce qui choque là dedans ?


---------------
Le site de ma maman
Reply

Marsh Posté le 10-02-2003 à 09:54:10    

Cherrytree a écrit :


 
Ben oui ! C'est normal. Qu'est ce qui choque là dedans ?


 
on aurait pu imaginer que la JVM soit capable de cloner une instance d'un objet dont il a la classe mais ca n'est pas si évident qu'il n'y parait c'est tout ...
 
Voir C++


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 10-02-2003 à 10:36:47    

Techniquement, la JVM pourrait faire cela, mais les concepteurs de Java ont choisi de permettre au programmeur d'interdire la fabrication d'un clone. Il y a des fois, où, en effet, cloner un objet n'a pas de sens : lorsqu'il s'agit d'une ressource critique du monde extérieur, ou que l'objet est un thread, par exemple.
 
++Taz> "new MonObjet(unObjet.toString())" ne clone pas un objet, car on n'a jamais la garantit que la représentation de l'objet que renvoie toString() décrit bien tout l'objet. "tostring()" est généralement utilisé pour afficher des traces de debug, ou une présentation possible de l'objet, lisible pour un humain. Ce qui signifie au passage que pour faire ce que tu dis (un constructeur qui attend en argument la représentation chaîne de l'objet), il faudrait développer un interpréteur pour cette représentation...  :ouch:
Ce n'est pas un peu lourd pour si peu ?  :sarcastic:  
 
Autre remarque : exemples de classe qui a un constructeur qui attend un seul argument de type String :

java.awt.Button(String label)  
          Constructs a Button with the specified label.
 
java.lang.Thread(String name)  
          Allocates a new Thread object.
 
java.io.FileInputStream(String name)  
          Creates a FileInputStream by opening a connection to an actual file, the file named by the path name name in the file system.
 
java.text.MessageFormat(String pattern)  
          Constructs a MessageFormat for the default locale and the specified pattern.
 


Comme tu peux le constater, aucun de ces constructeurs ne clone d'objet... La plupart des classes de l'API n'ont d'ailleurs pas de tel constructeur.
Il y a bien quelques exceptions, comme le constructeur de java.util.Date, mais ce dernier a été déprécié il y a déjà plusieurs années au profit d'une méthode statique au nom plus évocateur (Date.parseString()).


Message édité par BifaceMcLeOD le 10-02-2003 à 10:47:09
Reply

Marsh Posté le 10-02-2003 à 11:01:03    

DarkLord a écrit :


 
on aurait pu imaginer que la JVM soit capable de cloner une instance d'un objet dont il a la classe mais ca n'est pas si évident qu'il n'y parait c'est tout ...
 
Voir C++


 
Il ne critiquait pas le comportement de la JVM. Il disait que les concepteur de l'API Java auraient pu prévoir la copie de leurs classes (leur faire implémenter l'interface "Clonable" quoi).

Reply

Marsh Posté le 10-02-2003 à 20:10:23    

El_gringo a écrit :


 
Il ne critiquait pas le comportement de la JVM. Il disait que les concepteur de l'API Java auraient pu prévoir la copie de leurs classes (leur faire implémenter l'interface "Clonable" quoi).


 
beaucoup l'implémentent mais pas toutes, et parfois sans raison valables hormis la fénéantise des concepteurs; sur ce coup là l'API java c'est un peu la fête du slip :whistle:


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 12-02-2003 à 02:01:07    

++Taz a écrit :

je suis entrain d'apprendre à bidouiller en Java, et je suis assez surpris, mais cela vient peut etre de mon expérience C++.
 
beaucoup de classes de l'API ne possède ni méthode clone ni constructeur par recopie: par contre, un constructeur admettant une string en param est la. bref pour recopier, c'est à la batarde new MonObjet(unObjet.toString())
 
je sais que les cas ou l'on a besoin de véritable copie ne sont pas forcément fréquents, mais je trouve que les mecs qui ont fait ça ont un peu fait les radins...


 
C'est plutôt à toi de cloner et pas à eux non ? donne des exemples, je vois pas ce que tu veux cloner. N'oublie pas que le GC te permet d'éviter le copie profonde dans beaucoup de cas si tu viens du C++. C'est pas à eux de dire que telle classe qui est dans une bibliothèque est cloneable ou pas, c'est à toi de savoir si tu l'utilises en flyweight, en singleton, en handler de ressource externe ou en truc cloneable.

Reply

Marsh Posté le 12-02-2003 à 07:14:04    

évidemment j'ai un peux de mal à m'adapater, mais des fois j'ai besoin d'avoir des vrais copies profondes, et là si rien n'est prévu...

Reply

Marsh Posté le 12-02-2003 à 08:03:41    

++Taz a écrit :

évidemment j'ai un peux de mal à m'adapater, mais des fois j'ai besoin d'avoir des vrais copies profondes, et là si rien n'est prévu...


J'aimerais vraiment que tu files 1 ou 2 exemples, pour pouvoir me faire une idée, en gros, j'ai jamais eu le problème (mon problème en général, c'est plutôt de me démerder pour planquer les constructeurs afin que personne ne fasse de copie) mais je n'ai pas de cas en tête où c'est nécessaire et absent.
 
Concernant la copie profonde, c'est à toi de te démerder, à cause des cycles dans le graphe d'agrégation, ils auraient pu mettre un détecteur de cycles mais bon, le développeur sait mieux la tronche de son graphe que le concepteur du langage.
 
Quel type d'interface aurais-tu souhaité pour la copie ?

Reply

Marsh Posté le 12-02-2003 à 16:52:22    

++Taz a écrit :

je suis entrain d'apprendre à bidouiller en Java, et je suis assez surpris, mais cela vient peut etre de mon expérience C++.
 
beaucoup de classes de l'API ne possède ni méthode clone ni constructeur par recopie: par contre, un constructeur admettant une string en param est la. bref pour recopier, c'est à la batarde new MonObjet(unObjet.toString())
 
je sais que les cas ou l'on a besoin de véritable copie ne sont pas forcément fréquents, mais je trouve que les mecs qui ont fait ça ont un peu fait les radins...


 
Si je me rappelle bien de mes lectures à propos du C++, le constructeur de copie est nécessaire pour pouvoir passer les paramètres par valeur aux différentes fonctions. Comme en Java, ces passages se font par référence, il n'est pas nécessaire que tous les objets implémentent la méthode clone(). Le choix est donc laissé au développeur d'implémenter ou non clonable avec une copie profonde ou non.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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