Odi's astoundingly incomplete notes
New entries | CodeCloneable does not supersede the copy constructor
Common misconception: "Copy constructors are a relic from the C++ ages. In Java we have the Cloneable interface."
The clone method is handy when one has an object of an unknown (sub)class and you need a copy. You will most likely end up with an object of the same class. Consider the following scenario: You have a business object and you need to "split" it. So you need to copy parts of this structure. Some of the objects will be of a subtype of the declared field. So only their clone method can correctly perform the copy.
The copy constructor is much more type-safe. You know exactly which class you create and its constructor accepts an object of a well-known class. A copy constructor for example allows you do "downcast" an object. Consider the following scenario: You have an object of the last final class in a class hierarchy. Now you have to pass this object on to an XML serialization but you only want fields of a superclass to be serialized. A copy constructor of that superclass will solve the problem.
A variant of the copy constructor is the template pattern. In the template pattern the copy constructor accepts a template object of a superclass to initialize its state.
The clone method is handy when one has an object of an unknown (sub)class and you need a copy. You will most likely end up with an object of the same class. Consider the following scenario: You have a business object and you need to "split" it. So you need to copy parts of this structure. Some of the objects will be of a subtype of the declared field. So only their clone method can correctly perform the copy.
The copy constructor is much more type-safe. You know exactly which class you create and its constructor accepts an object of a well-known class. A copy constructor for example allows you do "downcast" an object. Consider the following scenario: You have an object of the last final class in a class hierarchy. Now you have to pass this object on to an XML serialization but you only want fields of a superclass to be serialized. A copy constructor of that superclass will solve the problem.
A variant of the copy constructor is the template pattern. In the template pattern the copy constructor accepts a template object of a superclass to initialize its state.
Add comment