[Java] clone() sur une String ?

J’ai un classe Message, qui contient une variable de type String qui s’appelle msg. Je dois implémenter une méthode clone() dans cette classe. J’ai fait comme ça:

protected Object clone() {
Message clonemsg = (Message)super.clone();
clonemsg.msg = (String)msg.clone();
return clonemsg;
}

Ma classe Message implemente la classe Cloneable. A la compilation, j’ai le message d’erreur “clone() has protected access in java.lang.Object”. Je ne sais pas comment cloner une variable de type String (je débute en Java), et je n’ai rien trouvé sur Google.
Programmeurs de la Cafzone, j’ai besoin de vos lumières !

Merci Glop, j’aurai au moins appris quelque chose aujourd’hui.

Merci beaucoup pour cet eclaircissement Glop. Et desolé d’avoir mis ta parole en doute, je le ref’rais plus, juré :o .

string est un objet mais il est immutable et final, il se comporte donc comme un type de base. On ne peut donc pas cloner un objet string au sens habituel. Ca vient d’un detail d’implementation/optimisation. Un seul objet string peut etre partage entre plusieurs references, pour reduire les couts en memoire. Par exemple si tu cree un objet string qui contient 100 chars, tu vas occuper 200 octets de memoires (unicode…). Si tu fais 1000 copies de cet objet, tu aurais besoin de 200 000 octets, mais comme string partage les refs tu vas seulement utiliser 200 octest pour la string et une reference pour chacune des copies. Du coup il est obligatoire que string soit immutable. Si tu veux changer la string, tu en fais un nouvel objet. Toute les operation sur string ne vont donc pas creer une nouvelle instance a proprement parler, puisque si tu fais une assignation le compilateur et la JIT va faire partager l’instance en memoire de toute maniere. MAIS toute les autres operation sur la string apres la copie vont creer une nouvelle instance, donc tout va bien.

Essaye ca pour verifier:

class test { String data; public static void main (String[] args) throws Exception{ test s1=new test(); s1.data="S"; test s2=(test)s1.clone(); System.out.println("s2 is" +s2.data); s2.data="A"; System.out.println("s1 is" +s1.data); } } [/quote] Moi je trouve que c'est degueulasse que tout les type de base n'ai pas de "boxing/unboxing" automatique (provoquant la presence de int [b]et[/b] Integer par exemple) mais en plus ca entretient la confusion comme le prouve ce thread :o (Hint: C#)

[Edité le 25/2/2003 par GloP]

dans mon souvenir, String est un cas à part, il peut être manipulé comme un Objet (les cast, les pointeurs, les héritages, etc… fonctionnent) mais peut aussi être manipulé comme un type de base…

mais c’est uniquement de souvenir donc je peux largement me planter… :slight_smile:

PS : la réponse m’interresse, ca me remettra le java en tête…

GloP vérifie tes dires, j’aurai mis ma main à couper que le String était un Objet (comme dit Onslaught, les types de base sont int, char, float, boolean, double, long). Enfin je me trompe peut-etre mais ca m’étonnerai beaucoup. a mon avis, String b = a fait pointer le String b vers l’objet a.
Pour ta question Onslaught, je vérifirai ce soir car je ne me souvient plus trop de comment on utilise l’interface cloneable. Tu auras la réponse demain. (Si Glop n’aura pas encore répondu)

String est un type de base en Java ? Je croyais que les types de base étaient int, char, float et boolean, et que String était un type objet. Bon, je vais tester ça demain, on verra bien. En tout cas, merci pour ton aide Glop.

string est un type de base que tu n’a pas a la cloner. Tu fais
string b = a;
c’est d’ailleurs ce que tu fais quand tu ecris:
string toto = « je suis une string »;
et ca te choque pas dans ce cas la… :wink:

[Edité le 24/2/2003 par GloP]