Metoda klonowania, interfejs klonowania — 1

Witaj Amigo!

- Cześć Kim.

— Opowiem ci o metodzie clone().

Celem tej metody jest sklonowanie obiektu - tj. utwórz jego klon/kopię/duplikat.

Jeśli zostanie wywołana, maszyna Java utworzy i zwróci duplikat obiektu, na którym wywołano tę metodę.

Klonowanie obiektu w klasie Object jest realizowane bardzo prymitywnie - podczas klonowania tworzony jest tylko jeden nowy obiekt: po prostu tworzony jest inny obiekt, a jego polom przypisuje się wartości pól przykładowego obiektu.

Jeśli skopiowany obiekt zawiera odniesienia do innych obiektów, odniesienia zostaną skopiowane, nie zostaną utworzone żadne duplikaty tych obiektów.

— Hm. Niewiele.

„Faktem jest, że maszyna Java nie wie, które obiekty można sklonować, a które nie. Na przykład plików nie można klonować. Podobnie jest z wątkiem System.in.

Dlatego kwestię pełnoprawnego klonowania pozostawiono twórcom klas. Tutaj wszystko odbywało się analogicznie do metody równych sobie. Ma nawet własny analogowy hashCode - jest to interfejs Cloneable.

Interfejs Cloneable to tak zwany interfejs znaczników, który nie zawiera żadnych metod. Służy do zaznaczania (zaznaczania) niektórych klas.

Jeśli twórca klasy uważa, że ​​obiekty klasy mogą być sklonowane, oznacza klasę tym interfejsem (dziedziczy klasę z Cloneable).

Jeśli programista nie jest zadowolony ze standardowej implementacji metody klonowania, musi napisać własną, która zduplikuje obiekt we właściwy sposób.

Podczas wywoływania metody clone () Java sprawdza, czy obiekt ma interfejs Cloneable. Jeśli tak, klonuje obiekt przy użyciu metody clone (), jeśli nie, zgłasza wyjątek CloneNotSupportedException.

- Tj. czy powinniśmy albo zastąpić metodę klonowania i napisać jej nową implementację, czy też odziedziczyć klasę z Cloneable?

- Tak, ale trzeba jeszcze przedefiniować metodę. Metoda clone() jest zadeklarowana jako chroniona, więc może być wywoływana tylko przez klasy w swoim pakiecie (java.lang.*) lub przez klasy pochodne.

- Jestem trochę zdezorientowany, więc co powinienem zrobić, aby sklonować obiekt?

- Spójrz, jeśli chcesz użyć „domyślnego klonowania”, które jest zaimplementowane w klasie Object, musisz:

a) Dodaj interfejs Cloneable do swojej klasy

b) Zastąp metodę klonowania i wywołaj w niej podstawową implementację:

class Point implements Cloneable
{
 int x;
 int y;

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

Lub możesz napisać własną implementację metody klonowania:

class Point
{
 int x;
 int y;

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

- Ciekawa metoda, skorzystam. Czasami…