aspose file tools
The moose likes Java in General and the fly likes Cloning and StringBuffering Big Moose Saloon
  Search | Java FAQ | Recent Topics
Register / Login
JavaRanch » Java Forums » Java » Java in General
Reply Bookmark "Cloning and StringBuffering" Watch "Cloning and StringBuffering" New topic
Author

Cloning and StringBuffering

Dennis Noren
Greenhorn

Joined: Jan 07, 2005
Posts: 15
I can make StringBuffer a verb, can't I?

I am implementing a cloneable interface, and it mostly seems to work correctly, except for the following.

I have a class Shape, with data elements
Color color;
StringBuffer description;

The clones seem to work correctly, except that when I try to run my setDesc method to change the description on the clone, it changes the description on the original also. My setColor method does not show the same behavior.



Here is my clone override method (there is also a rectangle subclass):



and here is my equals override method:



I create and clone as follows:



And then I print shape3 and shape4, and they both have the new text in the description data member. Any idea why this is happening?


Java novice, J2SE 1.4.2<br />Some C, some OOA/OOD
Ernest Friedman-Hill
author and iconoclast
Marshal

Joined: Jul 08, 2003
Posts: 24045
    
  13

The default implementation of clone() (the one you get by calling super.clone()) does a "shallow copy" -- the reference variables in the object are copied, but not the objects they point to. This means that after you call clone(), both the old and new Shape objects share the same StringBuffer object to hold their description, which obviously gives you the problem you're observing.

Solution: do the same thing with description that you do with rect!


[Jess in Action][AskingGoodQuestions]
 
I agree. Here's the link: http://jrebel.com/download
 
subject: Cloning and StringBuffering
 
Similar Threads
Overriding equals()
This must be embarrassingly simple
How to fix error in Rectangle Class problem in Java?
Drawing text inside a Graphics2D shape
Why does this get a run-time error?