Thursday, September 10, 2009

Shallow Copy & Deep Copy

Semua java class memilik method clone() yang diturunkan dari java.lang.Object. Method tersebut membuat copy dari sebuah object sebagai shallow copy. Apa yang dimaksud dengan shallow copy adalah :
1. Java membuat object baru di memori, termasuk membuat instance variabel yang bertipe primitive sekalipun.
2. Object lain yang direference oleh class yang diclone tersebut tidak dibuat copynya, hanya membuat reference baru ke object tersebut. Jadi kini ada dua reference yang mengarah pada object yang sama.

public class Car extends Object implements Cloneable {

private String carName;
private String carType;
private SUV suv;

public String getCarName() {
return carName;
}

public void setCarName(String carName) {
this.carName = carName;
}

public String getCarType() {
return carType;
}

public void setCarType(String carType) {
this.carType = carType;
}

public SUV getSuv() {
return suv;
}

public void setSuv(SUV suv) {
this.suv = suv;
}

@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}

@Override
public String toString() {
return "carName : " + carName + " car type : " + carType + " suv : " + suv;
}

}

public class SUV {

private String suvType;
private String suvModel;

public String getSuvType() {
return suvType;
}

public void setSuvType(String suvType) {
this.suvType = suvType;
}

public String getSuvModel() {
return suvModel;
}

public void setSuvModel(String suvModel) {
this.suvModel = suvModel;
}

@Override
public String toString() {
return "suv type : " + suvType + " suv model : " + suvModel;
}

}

public class Main {

public static void main(String[] args) {
SUV suv = new SUV();
suv.setSuvModel("suv model 1");
suv.setSuvType("suv type 1");

Car car = new Car();
car.setCarName("Timor");
car.setCarType("Sedan");
car.setSuv(suv);

System.out.println("car 1 : " + car);
try {
Car car2 = (Car) car.clone();
suv.setSuvModel("suv model update");
System.out.println("car 2 : " + car2);
System.out.println("car 1 : " + car);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
car 1 : carName : Timor car type : Sedan suv : suv type : suv type 1 suv model : suv model 1
car 2 : carName : Timor car type : Sedan suv : suv type : suv type 1 suv model : suv model update
car 1 : carName : Timor car type : Sedan suv : suv type : suv type 1 suv model : suv model update

Sedangkan deep copy adalah :
1. Java menduplikasi object yang dicopy termasuk variabel yang primitif.
2. Object yang direference pun dicopy sehingga kini dua object yang diclone merefer ke dua object yang berbeda.

Bagaimana implementasi deep copy pada java? Kita bisa mengoverride method clone() untuk keperluan deep copy ini.

0 comments:

 

©2009 Stay the Same | by TNB