Разница между способами клонирования

177
15 октября 2017, 21:07

Есть ли принципиальная разница между использованием super.clone() и созданием нового объекта с помощью new?

Пример:

public Space clone() throws CloneNotSupportedException {
    return (Space)super.clone();
}
public Space clone() throws CloneNotSupportedException {
    return new Space(number, square);
}
Answer 1

В документации Object.clone рекомендуется вызывать super.clone и приводятся доводы:

By convention, the returned object should be obtained by calling super.clone. If a class and all of its superclasses (except Object) obey this convention, it will be the case that x.clone().getClass() == x.getClass().

По соглашению, возвращаемый объект должен быть получен путем вызова super.clone. В случае если класс и все его предки (кроме Object) придерживаются соглашения, выполняется равенство x.clone().getClass() == x.getClass().

Дело в том, что Object.clone магическим образом возвращает объект, класс которого равен оригинальному. Это важно, т.к. позволяет наследникам не переопределять clone.

Приведу пример. Допустим, у класса Space есть наследник Subspace. Тогда следующий код в нем:

Subspace clone = (Subspace) this.clone();

,будет работать в первом случае и не будет во втором (вернется класс Space), что несколько неожиданно для клона.

READ ALSO
Одна сессия, но разные ID. WebSocket Java & JavaScript

Одна сессия, но разные ID. WebSocket Java & JavaScript

Пишу чат элементарныйЗапуская сервер - вижу, что количество сессий всегда равняется "1", сколько бы вкладок или браузеров я бы не открыл

247
Метод или операция не реализована

Метод или операция не реализована

Что значит "Метод или операция не реализована"? У меня в этом коде ошибка:

251
Could not connect to the debugger

Could not connect to the debugger

Во время начала выполнения программы появляется окно

206