Clone() vs Copy constructor- which is recommended in java
Clone is broken, so dont use it.
THE CLONE METHOD of the Object class
is a somewhat magical method that does
what no pure Java method could ever
do: It produces an identical copy of
its object. It has been present in the
primordial Object superclass since the
Beta-release days of the Java
compiler*; and it, like all ancient
magic, requires the appropriate
incantation to prevent the spell from
unexpectedly backfiring
Prefer a method that copies the object
Foo copyFoo (Foo foo){
Foo f = new Foo();
//for all properties in FOo
f.set(foo.get());
return f;
}
Read more
http://adtmag.com/articles/2000/01/18/effective-javaeffective-cloning.aspx
clone() vs copy constructor vs factory method?
Basically, clone is broken. Nothing will work with generics easily. If you have something like this (shortened to get the point across):
public class SomeClass<T extends Copyable> {
public T copy(T object) {
return (T) object.copy();
}
}
interface Copyable {
Copyable copy();
}
Then with a compiler warning you can get the job done. Because generics are erased at runtime, something that does a copy is going to have a compiler warning generating cast in it. It is not avoidable in this case.. It is avoidable in some cases (thanks, kb304) but not in all. Consider the case where you have to support a subclass or an unknown class implementing the interface (such as you were iterating through a collection of copyables that didn't necessarily generate the same class).
Copy constructors instead of Clone in java
Integer is immutable but you need to create a totally new ArrayList, and I mean here :
Bad(Bad b) {
a = b.a;
c = b.c;
}
do instead
Bad(Bad b) {
a = new ArrayList<>(b.a);
c = // this here must be copy constructed too
}
and then you will get
[10]
[10]
Why do we need copy constructor and when should we use copy constructor in java
There are 2 good reasons for using a copy constructor instead of the constructor passing all parameters :
- when you have a complex object with many attributes it is much simpler to use the copy constructor
- if you add an attribute to your class, you just change the copy constructor to take this new attribute into account instead of changing every occurence of the other constructor
Clone() vs Copy constructor- which is recommended in java
Clone is broken, so dont use it.
THE CLONE METHOD of the Object class
is a somewhat magical method that does
what no pure Java method could ever
do: It produces an identical copy of
its object. It has been present in the
primordial Object superclass since the
Beta-release days of the Java
compiler*; and it, like all ancient
magic, requires the appropriate
incantation to prevent the spell from
unexpectedly backfiring
Prefer a method that copies the object
Foo copyFoo (Foo foo){
Foo f = new Foo();
//for all properties in FOo
f.set(foo.get());
return f;
}
Read more
http://adtmag.com/articles/2000/01/18/effective-javaeffective-cloning.aspx
Java clone() method using new keyword and a copy constructor instead of super.clone()
You are trying to clone by implementing cloneable interface but not following recommended contracts of cloning.
You are basically creating new object using copy constructor, my question is then why do you need to implement cloneable?
If you are implementing cloneable then you must respect the contracts. When you use copy constructor inside clone method then i will not recommend this approach simply because clone of it child class will not be an object of child class and intstead will be an object of Person class.
Also want to point out that, using copy constructor instead of cloneable interface is more object oriented approach.
What's wrong with Copy Constructors? Why use Cloneable interface?
I think it's because there is no such inherent need for a copy constructor in Java and in C# for reference types. In C++ objects are named. You can (and you will most often) copy (and in C++1x move) them around e.g when returning from functions, since returning pointers require you to allocate dynamic memory which would be slow and painful to manage. The syntax is T(x) so it makes sense to make a constructor taking a T reference. C++ couldn't make a clone function, since that would require returning an object by value again (and thus another copy).
But in Java, objects are unnamed. There are only references to them, which can be copied, but the object itself isn't copied. For the cases when you actually need to copy them, you can use the clone call (but i read in other anwers clone is flawed. i'm no java programmer so i cannot comment that). Since not the object itself is returned, but rather a reference to it, a clone function will suffice. Also a clone function can be overriden. That's not going to work with copy constructors. And incidentally, in C++ when you need to copy a polymorphic object, a clone
function is required too. It's got a name, the so-called virtual copy constructor.
Related Topics
Try/Catch + Using, Right Syntax
Uploadfile with Post Values by Webclient
Bundling Not Working in MVC5 When I Turn on Release Mode
Understanding Floating Point Problems
Alternatives to System.Drawing for Use with ASP.NET
How to Detect Keypress While Not Focused
How to Form a Correct MySQL Connection String
Why Doesn't Include Have Any Effect
In C#, What Happens When You Call an Extension Method on a Null Object
How to Detect If a Property Exists on an Expandoobject
C# Sha-1 VS. PHP Sha-1...Different Results
Publishing a Website Is Not Updating My CSS Bundles
How to Call an ASP.NET C# Method Using JavaScript
What Is the "Volatile" Keyword Used For
How to Post Using Httpclient Content Type = Application/X-Www-Form-Urlencoded
Selenium Error - the Http Request to the Remote Webdriver Timed Out After 60 Seconds