Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Справочник Java

Cloneable

Маркерный интерфейс, который разрешает Object.clone(). В новом коде вместо него используют копирующие конструкторы.

Доступно с: Java 1.0

Синтаксис

public interface Cloneable

Примеры

clone() у массива — простой способ сделать копию:

void main() {
    int[] a = {1, 2, 3};
    int[] b = a.clone();
    b[0] = 99;
    IO.println(Arrays.toString(a) + " " + Arrays.toString(b));
}

Результат:

[1, 2, 3] [99, 2, 3]

Копирующий конструктор вместо Cloneable:

class Cart {
    final List<String> items;
 
    Cart() {
        items = new ArrayList<>();
    }
 
    Cart(Cart other) {
        items = new ArrayList<>(other.items);
    }
}
 
void main() {
    var cart = new Cart();
    cart.items.add("milk");
    var copy = new Cart(cart);
    copy.items.add("bread");
    IO.println(cart.items + " " + copy.items);
}

Результат:

[milk] [milk, bread]

Примечания

В Cloneable нет ни одного метода: он только разрешает Object.clone(), который в классе без этого интерфейса бросает CloneNotSupportedException. clone() делает неглубокую копию, его неудобно переопределять, и он плохо сочетается с final-полями — поэтому для своих классов лучше копирующий конструктор или фабрика copyOf(). У массивов clone() работает без оговорок.

См. также

  • Arrays.copyOf() — Копирует массив в новый — той же или другой длины. Часть массива копирует copyOfRange().
  • record — Объявляет запись — неизменяемый класс для хранения данных с готовыми equals(), hashCode() и toString().

Вопросы и ответы по теме

В учебнике

  • Методы класса Object — Методы toString, equals и hashCode в Java: как их переопределять и почему equals и hashCode всегда меняют вместе.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.