Varım o halde yazıyorum…

Java – Object – Clone() Metodu

Kasım 25th 2010 Java

Java’da bütün sınıfların türediği Object sınıfının bir metodu olan clone() ile bir nesnenin kopyasını almak mümkün. Fakat pratikte bir takım sıkıntılar ile karşılaşılabiliyor. Bunun sebebi clone() metodunun primitive olmayan tipler için, nesnenin kopyasını almak yerine bu nesnenin referansını kopyalıyor olması. Buna “Shadow Copy” deniyor. Bu gibi durumlarda clone() metodunu ezip, nasıl bir kopyalama yapacağını belirlememiz gerekiyor. Sınıf tipi (Class Type) alanları da “gerçekten” kopyaladığımız bu tür kopyalamaya da “Deep Copy” deniyor.

Tabi kopyasını almak istediğimiz sınıfın “Cloneable” arayüzünü gerçeklemesi gerekiyor. Bu şekilde sınıf tanımında “implements Cloneable” şeklinde bir belirtim yapmazsak “CloneNotSupportedException” fırlatılıyor. Daha sonra bir “Deep Copy” gerekiyor ise, ki gerçekte muhtemelen gerekiyordur, clone() metodunu eziyoruz (override). Bu gibi “Deep Copy” yapmak istediğimiz durumlarda yapabileceğimiz iki şey var. Birincisi gerçek kopyasını almak istediğimiz sınıfın sınıf tipindeki alanlarini da “Cloneable” yapıp bahsi geçen clone() metodunda bu clone() metotlarını çağırıp, bu sınıf tipindeki alanlara atamak.

@Override
       public Object clone() {
		Employee e = null;
		try {
			e = (Employee) super.clone();
                        Department d = e.getDepartment().clone();
                        e.setDepartment(d);
		} catch (CloneNotSupportedException cnsex) {
			//TODO:catch this 
		}
		return e;
	}

İkincisi ise clone() metodunda gerçek nesneler oluşturarak bunları kopyalanmak istenen nesnenin sınıf tipindeki alanlara atamak.

@Override
	public Object clone() {
		Employee e = null;
		try {
			e = (Employee) super.clone();
                        e.setSalary(BigDecimal.ZERO);
		} catch (CloneNotSupportedException cnsex) {
			//TODO:catch this 
		}
		return e;
	}

Önemli bir diğer ilke de kopyalama sonucu oluşan kopya nesne ile kopyalanan asıl nesne için kopyaNesne != asılNesne ifadesinin, kopya işlemi sonrası ilk aşamada kopyaNesne.equals(asılNesne) ifadesinin ve kopyaNesne.getClass() != asılNesne.getClass() ifadesinin her zaman doğru değer döndürmesi gerektiğidir. Son olarak kopyalanmak istenen sınıfın List veya Set gibi Collection sınıfından türeyen alanları mevcutsa ve bunları da gerçekten kopyalamak istiyorsak, bu listelerin her bir elemanını tek tek kopyalamamız gerektiğini unutmamak gerekiyor.

Bu kadar yazdık ettik ama yine de Java gurusu abilerimiz nesne kopyalama işlemleri için clone() metoduna çok güvenmeyip ve bağlı kalmayıp bunun yerine istediğimiz şekilde kopyalamayı gerçekleştiren yapılandırıcı metotlar yazmamızı salık veriyorlar bize.

Güncelleme : Örnek koda ve kod yorumlarına şuradan bakılabilir. Umarım daha açıklayıcı olmuştur.

Ayrıca konu ile ilgili faydalı olduğunu düşündüğüm şuraya da bakmakta fayda var.

Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail
5 Yorum
“Java – Object – Clone() Metodu”
Avatar
meh1

s.a kardes iyi hoş anlatmayacalısmıssınız ama bu clone yaptıgınız sınıf hangi sınıf hangi neysneyi kopyaladınız sınıfınızın elemanları neler ? yani hangi sınıftan yeni clone ediyorsunuz bunu acıkca yazmadıgınız için acıkcası hiç birsey anlamadım acaba acıklamanız mümkün mü ?


Avatar
meh1

hiç bilmeyen birine anlatır gibi acıklayabilirmisiniz ? pek kaynak bulamadıgım için ?


Avatar
Selman

Müsait olduğum bir vakit güncelleyip, bir örnekle daha anlaşılır hale getirmeye çalışırım dostum


Avatar
Bora

Teşekkürler


Avatar
Orhan

Çok kuru olmus. Örnek yetersiz. Employee’nin bir üst class’i ne ? Super ile olusan objenin tipi ne ? Eger object ise
bunu Epmloyee’e cast ettikten sonra “e” uzerinde getDepartment() nasil diyebiliyorsun ? “e” nin “Object” kisminin disindaki alanlar daha dolmadi.(Olustu ama dolmadi)
getDepartment() diyemezsin.

Kodu bir butun olarak vermen daha iyi olur.

Employee e = null;
e = (Employee) super.clone();
Department d = e.getDepartment().clone();




gerekli



gerekli - yayımlanmayacak


Yorum Yap & Fikrini Paylaş

[caption id="attachment_642" align="aligncenter" width="202"][/caption]

Ejder Kapanı’ndan beri bir filmi bu kadar eleştiresim, yerden yere vurasım gelmemişti. Ahan da yazıyorum.

Robert De Niro ve Edward Norton’u duyunca balıklama gittim filme. Bu müthiş ikiliden kötü iş çıkmazdı hani. Arkadaşlar sağolsun, iyi iş çıkarıp beni yanılttılar. Ne olduğuna, ne anlatmak istediğine hatta birşeyler anlatmak istediğine dahi karar verememiş bir […]

Önceki Yazılar

Eclipse’in bir kaç debug görünümü özelliğinden bahsedeyim.
Drop to frame
Bu sayede herhangi bir debug işlemi sırasında en baştaki breakpoint noktasında dönebiliyorsunuz. Tabi bu arada çalışan kodun meydan getirdiği değişiklikleri geri alma gibi bir özellik söz konusu değil.
Watchpoint
Herhangi bir genel değişkenin (global variable) olduğu satıra çift tıklayarak eklenebilir. Böylece değişken her değişikliğe uğradığında debug görünümüne […]

Sonraki Yazılar

Sharing
Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail