Использование клона может быть рискованным, очень рискованным, если вы не проверяете реализацию этого метода клонирования ... как можно предположить, что клон impl может действовать по-разному ... мелкий или глубокий клон ... и некоторые разработчики может не всегда проверять, какого рода клона они получат ...
В большом приложении, большой команде, это также рискованно, потому что при использовании клонирования, если вы изменяете реализацию клона, вы можете изменить поведение приложения и создавать новые ошибки ... и должны проверять везде, где был вызван клон (но это может быть то же самое для других методов объекта, таких как equals, toString ...
Если при модификации клона небольшого подкласса A (от глубокого к мелкому клону для примера), если экземпляр B имеет ссылку на A и подразумевается глубокий клон, то, поскольку объекты, на которые есть ссылки в A, не являются мелкими клонированными, клон B больше не будет глубоким клоном (и то же самое для любого класса, ссылающегося на экземпляр B ...).
Нелегко иметь дело с глубиной ваших методов клонирования.
Также, когда у вас есть интерфейс (расширяющий Clonable) и многие (многие!) Реализации, иногда вы проверяете некоторые значения и видите, что клоны глубоки, и вызываете клон на интерфейсе, но вы не можете быть уверены во время выполнения Все Impl действительно имеют глубокий клон и могут вносить ошибки ...
Подумайте, что может быть лучше для каждого метода включить метод shallowClone и метод deepClone, а для очень специфических нужд внедрить настраиваемые методы (например, вы хотите клонировать и ограничить глубину этого клона до 2, сделайте пользовательский импл для что во всех соответствующих классах).
Не думайте, что важно использовать метод клонирования в классе JDK, поскольку он не будет изменен другим разработчиком или, по крайней мере, не часто. Но вам лучше не вызывать clone для классов JDK, если вы не знаете реализацию класса во время компиляции. Я имею в виду, что вызов клона в ArrayList не имеет значения, но вызов его в Collection может быть опасным, поскольку другая реализация Collection может быть введена другим разработчиком (он может даже расширить коллекцию impl), и ничто не говорит вам, что клон этого impl будет работать так, как вы ожидаете ...