Как программист Java, иногда рано замечается, что существует функция Object.clone(), поэтому вы начинаете полагаться на нее для копирования объектов. Однако это не идеальное решение этой проблемы: оно хрупкое, полагающееся как на переопределение Object.clone(), так и на реализацию Cloneable; оно может привести к странным сбоям, обычно в виде исключений CloneNotSupportedExceptions; и, наконец, его очень легко реализовать неправильно – чтобы правильно скопировать объект, вам нужно вызвать clone() в суперклассе и сначала привести его. Если нет, то все сломается.
В моем собственном коде я обычно пытаюсь копировать только объекты, которыми я управляю, что означает, что я даю своим объектам конструкторы копирования для этой цели. Создать его достаточно просто, намного безопаснее, чем клонирование, и его можно проиллюстрировать небольшим примером:
public class MyObject {
// Fields
private int counter;
private boolean counterUsed;
private final String name;
private String description;
// Constructor
public MyObject() {
this.counter = 0;
this.counterUsed = false;
this.name = "No name";
this.description = "Please describe me!";
}
// Copy constructor
public MyObject(final MyObject other) {
this.counter = other.counter;
this.counterUsed = other.counterUsed;
this.name = other.name;
this.description = other.description;
}
// ... rest of class goes here ...
}
Если мне нужна копия экземпляра MyObject, я могу явно запросить ее с помощью конструктора копирования, а затем изменить все, что мне нужно изменить. Самое главное, что конструкторы копирования не могут выйти из строя так же, как клонирование, и способ их создания на C ++ также является рекомендуемым способом в Java – если вы знакомы с C ++, это не займет много времени для изучения!
Оригинал: “https://dev.to/wrldwzrd89/the-perils-of-java-s-object-clone-method-39a1”