Как программист 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”