Есть ли принципиальная разница между использованием super.clone()
и созданием нового объекта с помощью new
?
Пример:
public Space clone() throws CloneNotSupportedException {
return (Space)super.clone();
}
public Space clone() throws CloneNotSupportedException {
return new Space(number, square);
}
В документации 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
), что несколько неожиданно для клона.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Пишу чат элементарныйЗапуская сервер - вижу, что количество сессий всегда равняется "1", сколько бы вкладок или браузеров я бы не открыл
Что значит "Метод или операция не реализована"? У меня в этом коде ошибка: