Klonlama yöntemi ve Klonlanabilir arayüz - 1

"Merhaba, Amigo!"

"Merhaba Kim."

"Size clone() yönteminden bahsedeceğim."

"Bu yöntemin amacı, bir nesneyi klonlamak veya başka bir deyişle, nesnenin bir klonunu/kopyasını/kopyasını yaratmaktır."

"Bu yöntem çağrıldığında, Java sanal makinesi çağrıldığı nesnenin bir kopyasını oluşturur ve döndürür.

Object sınıfının klon yöntemini uygulaması çok ilkeldir: yalnızca bir yeni nesne oluşturulur ve orijinal nesnenin alanlarının değerleri, alanlarına atanır.

Kopyalanan nesne başka nesnelere referanslar içeriyorsa, bu referanslar kopyalanacaktır. Bu nesnelerin kopyaları oluşturulmayacak."

"Hmm. Devam edecek fazla bir şey yok."

"Mesele şu ki, Java sanal makinesi hangi nesnelerin klonlanabileceğini veya klonlanamayacağını bilmiyor. Örneğin, dosyalar klonlanamıyor. Aynı şey bir System.in akışı için de geçerli."

"Dolayısıyla, tam teşekküllü klonlama sorusu bir sınıfın geliştiricilerine yöneltildi. "Bu, eşittir yönteminin nasıl ele alındığına benzer. HashCode ile karşılaştırılabilir bir şey bile var: Klonlanabilir arayüz."

" Klonlanabilir arabirim, 'işaretleyici arabirim' olarak adlandırılan şeydir: herhangi bir yöntemi yoktur ve belirli sınıfları işaretlemek için kullanılır.

"Bir sınıfın geliştiricisi, sınıfın nesnelerinin klonlanabileceğine inanıyorsa, onu bu arayüzle işaretler (yani, sınıfın Klonlanabilir uygulamasını sağlar).

"Geliştirici, klonlama yönteminin standart uygulamasını beğenmezse, yinelenen bir nesneyi doğru şekilde oluşturacak kendi yöntemini yazmalıdır."

" clone () yöntemini çağırdığınızda Java, nesnenin Cloneable arabirimini destekleyip desteklemediğini kontrol eder. Destekliyorsa, clone ( ) yöntemini kullanarak nesneyi klonlar; desteklemiyorsa bir CloneNotSupportedException fırlatır."

"Başka bir deyişle, ya klon yöntemini geçersiz kılmalıyız ya da sınıfın Klonlanabilir uygulamasını yapmalıyız?"

"Evet, ama yine de yöntemi geçersiz kılmanız gerekiyor. clone() yöntemi korumalı olarak bildirildi, bu nedenle yalnızca kendi paketindeki (java.lang.*) sınıflar veya bunların alt sınıfları tarafından çağrılabilir."

"Biraz kafam karıştı - peki bir nesneyi klonlamak için ne yapmam gerekiyor?"

"Object sınıfının «varsayılan» klonlama yöntemini kullanmak istiyorsanız, şunları yapmanız gerekir:

" a) Klonlanabilir arabirimi sınıfınıza ekleyin"

" b) Klonlama yöntemini geçersiz kılın ve uygulamanız içinde üst sınıfın uygulamasını çağırın:"

class Point implements Cloneable
{
 int x;
 int y;

 public Object clone()
 {
  return super.clone();
 }
    }

"Ya da klon yönteminin bir uygulamasını tamamen kendi başınıza yazabilirsiniz:"

class Point
{
 int x;
 int y;

 public Object clone()
 {
  Point point = new Point();
  point.x = this.x;
  point.y = this.y;
  return point;
 }
}

"Bu ilginç bir yöntem. Eminim kullanacağım. Ara sıra..."