Örnek

Java'da clone Yönteminin Deep Clone Yapmadığını Gösteren Bir Örnek

Java'da bir object clone() yöntemi ile clone'u (kopya) alınabilir. Ancak bu kopya işlemi sadece nesnenin kopyasını alır. Nesnenin sahip olduğu class tipindeki nesnelerin koypasını almaz. Aşağıdaki örnekler bunu göstermektedir. Test sınıfını kopyası alınabilir hale getiriyoruz. Bunun için Cloneable interface'ni implement ettikten sonra clone() yöntemini override ediyoruz:
public class Test implements Cloneable {
	
	private int no;
	private String name;
	
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
}
Bu test sınıfını içeren bir sınıf yapıyoruz:
public class TestDeep implements Cloneable {
	
	private int no;
	private Test test;

	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public Test getTest() {
		return test;
	}
	public void setTest(Test test) {
		this.test = test;
	}
	
	@Override
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
	
}
Şimdi bir uygulama yapıp TestDeep sınıfını clone() yöntemini çağırıyoruz ve içerisindeki test nesnesini değiştiriyoruz:
public class DeepCloneTestApp {
	
	public static void main(String[] args) {
		
		Test t=new Test();
		t.setNo(1);
		t.setName("Tester");
		
		TestDeep parent=new TestDeep();
		parent.setNo(100);
		parent.setTest(t);
		
		try {
			TestDeep t2=(TestDeep)parent.clone();
			
			t2.setNo(1283);
			t2.getTest().setNo(1453);
			t2.getTest().setName("Deep");
			
			System.out.println("Orjinal:"+t.getNo()+","+t.getName());
			System.out.println("Orjinal Deep:"+t2.getNo());
			System.out.println("Kopya Deep:"+t2.getTest().getNo()+","
					+t2.getTest().getName());
			
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		
	}
}
Uygulama aşağıdaki çıktıyı verir :
Orjinal:1453,Deep
Orjinal Deep:1283
Kopya Deep:1453,Deep
Dikkat edilir ise aşağıdaki gibi yapılan değişiklikler t nesnesini de değiştirmiştir.
t2.getTest().setNo(1453);
t2.getTest().setName("Deep");
Bu nedenle t nesnesinin değerleri de 1453 ve Deep olmuştur. Sonuç olarak TestDeep sınıfının nesnesi t2 kopyalandığında içindeki t nesnesi kopyalanmamıştır.
zafer.teker , 08.04.2022

Bu Sayfayı Paylaş:

Fibiler Üyelerinin Yorumları


Tüm üyeler içeriklere yorum ekleyerek katkıda bulunabilir : Yorum Gir

Misafir Yorumları




Bu Sayfayı Paylaş:

İletişim Bilgileri

Takip Et

Her Hakkı Saklıdır. Bu sitede yayınlanan tüm bilgi ve fikirlerin kullanımından fibiler.com sorumlu değildir. Bu sitede üretilmiş , derlenmiş içerikleri, fibiler.com'u kaynak göstermek koşuluyla kendi sitenizde kullanılabilirsiniz. Ancak telif hakkı olan içeriklerin hakları sahiplerine aittir