In programming language like Java, everything revolves around objects. Lifecycle of object from creation to garbage collection is something that keeps happening continuously in any realtime application.
There are different ways you can use to create and Object of a Class. However, the object creation with new
keyword is the straightforward one.
Car mercedes = new Mercedes();
While we keep creating objects on-demand, in some realtime scenarios we may need to create new object which is a copy of existing object. In that case new Object should hold same state as current Object is holding.
You may ask, what kind of scenarios require copying existing object?
Well, it completely depends on the software you are developing but in any application where you see copy option, whether it can be copying table row, copying form etc. such cases are good candidates to use object copying mechanism.
There are two approaches you can use to copy object,
- Shallow copy
- Deep copy
There are different methods to implement copying approach,
- Using
clone
method
- Copy constructor
- Static factory method
There are certain third party libraries available which provides methods to copy the objects.
For example, BeanUtils#copyProperties(Object destination, Object source)
Which option to choose majorly depends on your requirement.
Shallow copy
All the fields of existing object is copied to new object.
Consider following diagram, while copying Car object, company object reference is reused in the copy object, which simply means shallow copy only copies values (variable and object references).
Basically, it doesn’t create copy of objects referenced inside the object we want to copy, thus it is called shallow copy.
Following is a shallow copy example using copy constructor method,
class Car {
private String model;
private Company company;
public Car(String model, Company company) {
this.model = model;
this.company = company;
}
public Car(Car carToCopyFrom) {
this(carToCopyFrom.model, carToCopyFrom.company);
}
}
Deep copy
All the fields along with the objects referenced by existing object are copied to new object.
Consider following diagram, company object is also copied and reference to this new object is used in car object. Note that all the referenced objects at any level (direct or indirect) are copied and referred in copy object.
Following is a deep copy example using copy constructor method,
class Car {
private String model;
private Company company;
public Car(String model, Company company) {
this.model = model;
this.company = company;
}
public Car(Car carToCopyFrom) {
this(carToCopyFrom.model, new Company(carToCopyFrom.company.getName()));
}
}