Klonlama, temel bir programlama paradigmasıdır. Java'nın onu birçok yönden kötü uygulamış olabileceği gerçeği, klonlama ihtiyacını hiçbir şekilde azaltmaz. Ve, nasıl çalışırsanız çalışsın, sığ, derin, karışık, her neyse, işe yarayacak klonlamayı uygulamak kolaydır. Hatta işlev için klon adını kullanabilir ve isterseniz Cloneable'ı uygulayamazsınız.
B ve C'nin A'dan türetildiği A, B ve C sınıflarım olduğunu varsayalım. A tipi nesnelerin bir listesine aşağıdaki gibi sahipsem:
ArrayList<A> list1;
Şimdi, bu liste A, B veya C tipi nesneleri içerebilir. Nesnelerin ne tür olduğunu bilmiyorsunuz. Yani listeyi şu şekilde kopyalayamazsınız:
ArrayList<A> list2 = new ArrayList<A>();
for(A a : list1) {
list2.add(new A(a));
}
Nesne aslında B veya C türündeyse, doğru kopyayı alamazsınız. Ve ya A soyutsa? Şimdi, bazı insanlar bunu önerdi:
ArrayList<A> list2 = new ArrayList<A>();
for(A a : list1) {
if(a instanceof A) {
list2.add(new A(a));
} else if(a instanceof B) {
list2.add(new B(a));
} else if(a instanceof C) {
list2.add(new C(a));
}
}
Bu çok çok kötü bir fikir. Ya yeni bir türetilmiş tür eklerseniz? Ya B veya C başka bir paketteyse ve bu sınıfta bunlara erişiminiz yoksa?
Yapmak istediğiniz şey şudur:
ArrayList<A> list2 = new ArrayList<A>();
for(A a : list1) {
list2.add(a.clone());
}
Birçok kişi klonun temel Java uygulamasının neden sorunlu olduğunu belirtti. Ancak bu şekilde kolayca aşılabilir:
A sınıfında:
public A clone() {
return new A(this);
}
B sınıfında:
@Override
public B clone() {
return new B(this);
}
C sınıfında:
@Override
public C clone() {
return new C(this):
}
Klonlanabilir uygulamıyorum, sadece aynı işlev adını kullanıyorum. Bundan hoşlanmıyorsanız, başka bir isim verin.