Методът за клониране и интерфейсът за клониране - 1

„Здрасти, Амиго!“

— Здравей, Ким.

„Ще ви разкажа за метода clone().“

„Смисълът на този метод е да се клонира обект, or с други думи, да се създаде клонинг/копие/дубликат на обекта.“

„Когато се извика този метод, виртуалната машина на Java създава и връща дубликат на обекта, към който е извикана.

Реализацията на метода клониране от класа Object е много примитивна: създава се само един нов обект и стойностите на полетата на оригиналния обект се присвояват на неговите полета.

Ако копираният обект съдържа препратки към други обекти, тогава тези препратки ще бъдат копирани. Дубликати на тези обекти няма да бъдат създадени."

"Хм. Това не е много за продължаване."

„Работата е там, че виртуалната машина на Java не знае кои обекти могат or не могат да бъдат клонирани. Например, файловете не могат да бъдат клонирани. Същото важи и за System.in поток.“

"И така, въпросът за пълноценното клониране беше поставен на разработчиците на клас. "Всичко това е подобно на начина, по който се обработва методът equals. Има дори нещо, сравнимо с hashCode: интерфейсът Cloneable."

„ Интерфейсът Cloneable е това, което се нарича „интерфейс на маркер“: той няма ниHowви методи и се използва за маркиране на определени класове.

„Ако разработчикът на клас вярва, че обектите на класа могат да бъдат клонирани, той го маркира с този интерфейс (т.е. кара класа да изпълнява Cloneable).“

„Ако разработчикът не харесва стандартната реализация на метода за клониране, той трябва да напише свой собствен, който ще създаде дублиран обект по правилния начин.“

„Когато извикате метода clone (), Java проверява дали обектът поддържа интерфейса Cloneable. Ако го прави, тогава клонира обекта с помощта на метода clone (); ако не, хвърля CloneNotSupportedException.“

„С други думи, трябва or да отменим метода на клониране, or да накараме класа да изпълнява Cloneable?“

„Да, но все пак трябва да замените метода. Методът clone() е деклариран като защитен, така че може да бъде извикан само от класове в неговия пакет (java.lang.*) or техните подкласове.“

„Малко съм объркан – така че Howво трябва да направя, за да клонирам обект?“

"Ако искате да използвате метода за клониране по подразбиране на класа Object, трябва да:

" а) Добавете Cloneable интерфейс към вашия клас"

" b) Заменете метода на клониране и извикайте изпълнението на суперкласа във вашето изпълнение:"

class Point implements Cloneable
{
 int x;
 int y;

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

„Или можете да напишете изпълнение на метода за клониране изцяло самостоятелно:“

class Point
{
 int x;
 int y;

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

„Това е интересен метод. Сигурен съм, че ще го използвам. От време на време…“