Рубрики
Без рубрики

Опасности метода Java Object.clone()

Как программист Java, иногда на ранней стадии замечается, что существует Object.clone(), поэтому вы начинаете по-настоящему… Помеченный java, качество кода.

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