Wednesday, 8 June 2016

Shallow and Deep Copy Cloning


Shallow CloningThe default version of clone() method creates the shallow copy of an object. The shallow copy of an object will have exact copy of all the fields of original object. If original object has any references to other objects as fields, then only references of those objects are copied into clone object, copy of those objects are not created. That means any changes made to those objects through clone object will be reflected in original object or vice-versa.
Shallow copy is fast and also less expensive.Shallow copy is preferred if an object has only primitive fields.

Deep CloningDeep copy of an object will have exact copy of all the fields of original object just like shallow copy. But in additional, if original object has any references to other objects as fields, then copy of those objects are also created by calling clone() method on them.Any changes made to clone object will not be reflected in original object or vice-versa.
Deep copy is slow and very expensive.Deep copy is preferred if an object has references to other objects as fields.


shallow and deep cloning exampels :

1)  public class Course {

String dept1;

String dept2;

String dept3;

public String getDept1() {
return dept1;
}

public void setDept1(String dept1) {
this.dept1 = dept1;
}

public String getDept2() {
return dept2;
}

public void setDept2(String dept2) {
this.dept2 = dept2;
}

public String getDept3() {
return dept3;
}

public void setDept3(String dept3) {
this.dept3 = dept3;
}

public Course(String dept1, String dept2, String dept3) {
super();
this.dept1 = dept1;
this.dept2 = dept2;
this.dept3 = dept3;
}

}
# shallow
2)  public class Employee implements Cloneable {

String firstName;
String lastName;
int ID;
    Course course;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getID() {
return ID;
}
public void setID(int iD) {
ID = iD;
}
public Employee(String firstName, String lastName, int iD, Course course) {
super();
this.firstName = firstName;
this.lastName = lastName;
ID = iD;
this.course = course;
}
public Course getCourse() {
return course;
}
public void setCourse(Course course) {
this.course = course;
}
 
    protected Object clone() throws CloneNotSupportedException{
return super.clone();
   
    }

}
3 ) public class DeepCopy implements Cloneable {

String deepName;
Course course;
public String getDeepName() {
return deepName;
}
public void setDeepName(String deepName) {
this.deepName = deepName;
}
public Course getCourse() {
return course;
}
public void setCourse(Course course) {
this.course = course;
}

protected Object clone() {
return new DeepCopy(deepName, new Course(this.course.dept1,this.course.dept2,this.course.dept3));

}
public DeepCopy(String deepName, Course course) {
super();
this.deepName = deepName;
this.course = course;
}
}

4)   public class CloneTest {

public static void main(String[] args) throws CloneNotSupportedException {
// TODO Auto-generated method stub
Course course = new Course("CSE", "ECE", "IT");
Employee employee = new Employee("anil", "kumar", 111, course);
Employee employeeCloned = (Employee) employee.clone();
System.out.println("employee details an with out cloning,getting courese details" + employee.getFirstName()
+ " " + employee.getID() + " " + employee.course.getDept1());
System.out.println("employee details with  cloning ,getting courese details" + employeeCloned.getFirstName()
+ " " + employeeCloned.getID() + " " + employee.course.getDept1());

employee.setFirstName("sai");
employee.course.setDept1("EEE");

System.out.println("after cahnge ign values");

System.out.println("employee details with out cloning,getting courese details" + employee.getFirstName() + " "
+ employee.getID() + " " + employee.course.getDept1());
System.out.println("employee details with  cloning, getting courese details" + employeeCloned.getFirstName()
+ " " + employeeCloned.getID() + " " + employee.course.getDept1());

/** deep copy testin **/

Course deepCourse = new Course("Architec", "SE", "ASE");
DeepCopy deepCopy = new DeepCopy("depat1", deepCourse);

System.out.println("befor cloning deepcopy " + deepCopy.getDeepName() + " " + deepCopy.course.getDept3());
DeepCopy clonedDeepCpy=(DeepCopy) deepCopy.clone();
System.out.println("befor cloning deepcopy " + clonedDeepCpy.getDeepName() + " " + clonedDeepCpy.course.getDept3());
deepCourse.setDept3("SSE");
deepCopy.setDeepName("dept2");
System.out.println("after cahge teh values of origial object, deepcopy " + deepCopy.getDeepName() + " " + deepCopy.course.getDept3());

System.out.println("after cahge teh values of origial object, cloning deepcopy " + clonedDeepCpy.getDeepName() + " " + clonedDeepCpy.course.getDept3());
}

}

output  :

employee details an with out cloning,getting courese details:: anil 111 CSE
employee details with  cloning ,getting courese details  :: anil 111 CSE
after cahnge ign values
employee details with out cloning,getting courese details :: sai 111 EEE
employee details with  cloning, getting courese details ::    anil 111 EEE
befor cloning deepcopy ::  depat1 ASE
befor cloning deepcopy ::  depat1 ASE
after cahge teh values of origial object, deepcopy::  dept2 SSE
after cahge teh values of origial object, cloning deepcopy ::  depat1 ASE