Подтвердить что ты не робот

Выполняет ли Scala AnyRef.clone мелкую или глубокую копию?

В Scala выполняется ли AnyRef.clone мелкая или глубокая копия?

4b9b3361

Ответ 1

Короткий ответ: неглубокий.

Не очень короткий ответ: Если он не переопределен, AnyRef.clone() использует реализацию Java Object.clone() в качестве его реализации.

Javadoc в Object.clone():

Метод clone для класса Object выполняет определенную операцию клонирования. Во-первых, если класс этого объекта не реализует интерфейс Клонируемый, затем Вызывается исключение CloneNotSupportedException. Обратите внимание, что все массивы считаются реализовать интерфейс Cloneable. В противном случае этот метод создает новый экземпляр класса этого объекта и инициализирует все свои поля с помощью точно содержание соответствующие поля этого объекта, как бы по заданию; содержание поля сами по себе не клонируются. Таким образом, этот метод выполняет "мелкие копировать" этого объекта, а не "глубоко копировать".

Обратите внимание:

  • AnyRef.clone(), как и его аналог в Java, имеет "защищенный" уровень доступа, поэтому его не можно использовать везде.
  • Для работы clone() вам необходимо реализовать Cloneable.

Длинный ответ: прочитайте эффективную Java, 2-е издание, пункт 11: разумно отверните клон

Резюме. Не используйте его. Есть лучшие альтернативы.