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 всегда меняют вместе.