Home > Java > Cloning Object pada Java

Cloning Object pada Java

September 26, 2011 Leave a comment Go to comments

Pada postingan ini saya akan menulis tentang mengopi object pada Java. Object dari suatu class pada Java direferensikan menggunakan reference type, dan tidak ada cara langsung untuk mengopi isi / konten dari suatu object. Menggunakan operator assignment dari satu reference ke refence lainya hanya akan mereferensikan object yang sama. Oleh karena itu pada Java terdapat method clone() yang menyediakan mekanisme standar bagi object untuk mengopi dirinya sendiri.
Berikut ini detail tentang method tersebut.
protected Object clone() throws CloneNotSupportedException
Untuk dapat menggunakan method tersebut class dari object harus mengimplementasikan interface Cloneable,mengubah identifier method tersebut menjadi public dan mengoveride method clone tersebut ( default override ).
Karena default behavior dari override tersebut adalah shallow copy yang berarti semua nilai dari field object asli dikopi ke field dari object baru ( clone ). Jika field dari object original mereferensikan ke object lain misal objectA,
maka field dari object clone juga mereferensikan ke objectA tersebut. Jika field dari object yang akan dikopi mereferensikan ke object lain diperlukan deep copy, deep copy dapat dilakukan dengan customasi override method clone sesuai dengan kebutuhan.

Berikut ini contoh dari shallow copy dan deep copy agar lebih jelas.

1. Shallow Copy

Test.java

public class Test  {
private String nameTest;
public Test(String s)
{
nameTest =s;
}
public void setNameTest(String s)
{
nameTest = s;
}
public String getNameTest()
{
return nameTest;
}

}

Person.java

public class Person implements Cloneable {
private String namePerson;
private Test test;

public Person(String s, String t) {
namePerson = s;
test = new Test(t);
}

public Test getTest()
{
return test;
}
public String getNamePerson() {
return namePerson;
}

public void setNamePersnon(String s) {
namePerson = s;
}

@Override
public Object clone()
{ /* Shallow Copy */
try
{
return super.clone();
}
catch(CloneNotSupportedException e)
{
return null;
}
}
}

Main.java

public class Main {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Person p1 = new Person(“Adam”,”Biology”);
System.out.println(“Original (orginal values): ” + p1.getNamePerson() + ” – ”
+ p1.getTest().getNameTest());

Person p2 = (Person) p1.clone();
System.out.println(“Clone (before change): ” + p2.getNamePerson()+ ” – ”
+ p2.getTest().getNameTest());

p2.setNamePersnon(“Samantha”);
p2.getTest().setNameTest(“Math”);

System.out.println(“Clone (After change): ” + p2.getNamePerson()+ ” – ”
+ p2.getTest().getNameTest());

System.out.println(“Original (After clone modified): ” + p1.getNamePerson() + ” – ”
+ p1.getTest().getNameTest());

}

}

Output dari contoh diatas :

Original (orginal values): Adam – Biology
Clone (before change): Adam – Biology
Clone (After change): Samantha – Math
Original (After clone modified): Adam – Math

Perhatikan output diatas, terutama yang di-bold.

2.Deep Copy

Test.java

public class Test  {
private String nameTest;
public Test(String s)
{
nameTest =s;
}
public void setNameTest(String s)
{
nameTest = s;
}
public String getNameTest()
{
return nameTest;
}

}

Person.java

public class Person implements Cloneable {
private String namePerson;
private Test test;

public Person(String s, String t) {
namePerson = s;
test = new Test(t);
}

public Test getTest()
{
return test;
}
public String getNamePerson() {
return namePerson;
}

public void setNamePersnon(String s) {
namePerson = s;
}

@Override
public Object clone() /////s  CloneNotSupportedException
{ /* Deep Copy */
Person p = new Person(namePerson, test.getNameTest());
return p;
}
}

Main.java

public class Main {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Person p1 = new Person(“Adam”,”Biology”);
System.out.println(“Original (orginal values): ” + p1.getNamePerson() + ” – ”
+ p1.getTest().getNameTest());

Person p2 = (Person) p1.clone();
System.out.println(“Clone (before change): ” + p2.getNamePerson()+ ” – ”
+ p2.getTest().getNameTest());

p2.setNamePersnon(“Samantha”);
p2.getTest().setNameTest(“Math”);

System.out.println(“Clone (After change): ” + p2.getNamePerson()+ ” – ”
+ p2.getTest().getNameTest());

System.out.println(“Original (After clone modified): ” + p1.getNamePerson() + ” – ”
+ p1.getTest().getNameTest());

}

}

Output

Original (orginal values): Adam – Biology
Clone (before change): Adam – Biology
Clone (After change): Samantha – Math
Original (After clone modified): Adam – Biology

perhatikan output diatas terutama yang di-bold

Untuk deep copy dapat dilakukan sedikit modifikasi dan output yang dihasilkan sama, sebagai berikut.

Test.java

public class Test implements Cloneable {
private String nameTest;
public Test(String s)
{
nameTest =s;
}
public void setNameTest(String s)
{
nameTest = s;
}
public String getNameTest()
{
return nameTest;
}
@Override
public Object clone()
{
try
{
return super.clone();
}
catch(CloneNotSupportedException ex)
{
System.out.print(ex);
return null;
}
}

}

Person.java

public class Person implements Cloneable {
private String namePerson;
private Test test;

public Person(String s, String t) {
namePerson = s;
test = new Test(t);
}

public Test getTest()
{
return test;
}
public String getNamePerson() {
return namePerson;
}

public void setNamePersnon(String s) {
namePerson = s;
}

@Override
public Object clone() throws CloneNotSupportedException /////s  CloneNotSupportedException
{ /* Deep Copy */
Person p = (Person) super.clone();
p.test = (Test) p.test.clone();
return p;
}
}

Main.java

public class Main {

/**
* @param args the command line arguments
*/
public static void main(String[] args) throws CloneNotSupportedException {
Person p1 = new Person(“Adam”,”Biology”);
System.out.println(“Original (orginal values): ” + p1.getNamePerson() + ” – ”
+ p1.getTest().getNameTest());

Person p2 = (Person) p1.clone();
System.out.println(“Clone (before change): ” + p2.getNamePerson()+ ” – ”
+ p2.getTest().getNameTest());

p2.setNamePersnon(“Samantha”);
p2.getTest().setNameTest(“Math”);

System.out.println(“Clone (After change): ” + p2.getNamePerson()+ ” – ”
+ p2.getTest().getNameTest());

System.out.println(“Original (After clone modified): ” + p1.getNamePerson() + ” – ”
+ p1.getTest().getNameTest());

}

}

Semoga bermanfaat.

Referensi : dari berbagai sumber.😀

  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: