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

Я соглашаюсь, что это зависит полностью от того, какой ученик Вы. Однако я был в двух компаниях, которые имели очень большие кодовые базы для начала. Как правило, я работаю как это:

, Если возможно, перед рассмотрением любого функционального кода, я прохожу модульные тесты, которые уже записаны. Они могут обычно выручать довольно много. Если они не доступны, то я делаю следующее.

Первый, я в основном игнорирую реализацию и смотрю только на заголовочные файлы или просто интерфейсы класса. Я пытаюсь понять то, какова цель каждого класса. Во-вторых, я иду один уровень глубоко в реализацию, запускающуюся с того, что, кажется, область большей части важности. Это трудно измерить, поэтому иногда я только запускаю наверху и прокладываю себе путь вниз в списке файлов. Я называю это изучение в ширину. После этого начального шага я обычно иду мудрый глубиной через остальную часть кода. Начальный взгляд в ширину помогает укрепиться/устранить любые идеи, которые я получил от интерфейсного уровня, и затем мудрый глубиной взгляд показывает мне шаблоны, которые использовались для реализации системы, а также различных дизайнерских идей. В глубину я подразумеваю, что Вы в основном ступаете через программу с помощью отладчика, ступая в каждую функцию, чтобы видеть, как это работает и так далее. Это, очевидно, не возможно с действительно большими системами, но 20k LOC не то, что многие. :)

13
задан JasonMArcher 8 July 2015 в 04:38
поделиться

1 ответ

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

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

Javadoc on Object.clone ():

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

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

  1. AnyRef.clone (), как и его аналог в Java, имеет« защищенный »уровень доступа, поэтому его не можно вызывать отовсюду.
  2. Вы потребуется реализовать Cloneable для работы clone ().

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

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

21
ответ дан 1 December 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: