Metoda clonării și interfața clonabilă - 1

"Bună, Amigo!"

— Bună, Kim.

„O să vă spun despre metoda clone()”.

„Scopul acestei metode este de a clona un obiect sau, cu alte cuvinte, de a crea o clonă/copie/duplicare a obiectului.”

„Când această metodă este apelată, mașina virtuală Java creează și returnează un duplicat al obiectului pe care este apelată.

Implementarea metodei clone de către clasa Object este foarte primitivă: este creat un singur obiect nou, iar valorile câmpurilor obiectului original sunt alocate câmpurilor acestuia.

Dacă obiectul copiat conține referințe la alte obiecte, atunci acele referințe vor fi copiate. Nu vor fi create duplicate ale acestor obiecte.”

— Hmm. Nu e mult de continuat.

"Chestia este că mașina virtuală Java nu știe ce obiecte pot sau nu pot fi clonate. De exemplu, fișierele nu pot fi clonate. Același lucru este valabil și pentru un flux System.in."

„Deci, problema clonării cu drepturi depline a fost adresată dezvoltatorilor unei clase. „Totul este similar cu modul în care este gestionată metoda equals. Există chiar și ceva comparabil cu hashCode: interfața Cloneable.”

„ Interfața Cloneable este ceea ce se numește „interfață de marcare”: nu are nicio metodă și este folosită pentru a marca anumite clase.

„Dacă dezvoltatorul unei clase crede că obiectele clasei pot fi clonate, el o marchează cu această interfață (adică face ca clasa să implementeze Clonabil).”

„Dacă dezvoltatorului nu îi place implementarea standard a metodei clonării, el trebuie să o scrie pe a sa care va crea un obiect duplicat în mod corect.”

„Când apelați metoda clone (), Java verifică dacă obiectul acceptă interfața Cloneable. Dacă o face, atunci clonează obiectul folosind metoda clone (); dacă nu, lansează o excepție CloneNotSupportedException."

„Cu alte cuvinte, trebuie fie să suprascriem metoda clonării, fie să facem ca clasa să implementeze Clonabil?”

„Da, dar tot trebuie să suprascrieți metoda. Metoda clone() este declarată ca protejată, deci poate fi apelată numai de clasele din pachetul său (java.lang.*) sau de subclasele acestora.”

„Sunt puțin confuz, deci ce trebuie să fac pentru a clona un obiect?”

„Dacă doriți să utilizați metoda de clonare „implicit” a clasei Object, trebuie să:

" a) Adăugați interfața care poate fi clonată la clasa dvs."

" b) Suprascrieți metoda clonării și apelați implementarea superclasei în implementarea dvs.:"

class Point implements Cloneable
{
 int x;
 int y;

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

„Sau puteți scrie o implementare a metodei clonării în întregime pe cont propriu:”

class Point
{
 int x;
 int y;

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

„Este o metodă interesantă. Sunt sigur că o voi folosi. Ocazional…”