Örnek

Java'da clone Yöntemleri ile Yapılan Basit Bir Deep Clone 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. Ancak ana sınıf içinde tüm sahip olan sınıflar için ayrı clone() yöntemi çağrılabilir.
Aşağıdaki gibi bir test sınıfı olsun :
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ı kullanan bir ana sınıfı aşağıdaki gibi yapabiliriz :
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 {
		
		TestDeep testDeep=(TestDeep)super.clone();
		
		Test testClone=(Test)testDeep.getTest().clone();
		
		testDeep.setTest(testClone);
		
		return testDeep;
	}
	
}
clone() yönteminde TestDeep kendisinin kopyaladıktan sonra kendisi içindeki test nesnesini de kopyalayıp set etmektedir. Bu şekilde TestDeep kopyalandığında test nesnesi de kopyalanmış olacaktır. Aşağıdaki gibi bir uygulama yapalım :
public class DeepCloneTester {
	
	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();
		}
		
	}
}
Bu uygulamayı çalıştırdığımızda aşağıdaki gibi bir çıktı üretecektir :
Orjinal:1,Tester
Orjinal Deep:1283
Kopya Deep:1453,Deep
Görüldüğü gibi t1 içindeki Test tipindeki nesne değiştirlmesine rağmen orjinal nesne değişmemiştir.
t2.getTest().setNo(1453);
t2.getTest().setName("Deep");

Sonuç olarak bir sınıf kendi sınıfı içindeki nesneleri klonlayarak deep clone (derin kopyalama) yapabilir. Ancak burada kullanılan tüm nesneler de kendi clone() yöntemlerinde aynı şekilde geliştirme yapmalıdır. Örneğin Test nesnesinde başka bir nesne olsaydı ve o klonlanmasaydı o nesnenin refansı kullanılacaktı ve kopyada değiştirildiği an orjinal nesne de değişmiş olacaktı. Bu nedenle çok fazla nesne yapısı olan bir sınıfın tam bir derin kopyalama yapılması için her sınıfın clone() yöntemini doğru bir şekilde yazmış olması gerekmektedir.
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