В качестве полуотносительного мысленного вопроса: будет ли полезным создание интерфейса (назовите его ReallyCloneable), который выставляет clone () в качестве открытого члена?
Я утверждаю, что нет, не будет. Клонируемость тесно связана с реализацией конкретного класса. Я не могу вспомнить ни одного случая использования, когда я могу сказать: «У меня есть произвольный объект, и я хочу его копию». Непосредственный вопрос: зачем вам эта копия?
И типичный ответ таков, что вы можете изменить копию, не затрагивая оригинал. Однако, чтобы сделать это, вам нужно знать, какой тип объекта вы держите, иначе как вы узнаете, что вызывать, чтобы изменить его? И если вы это знаете, вы узнаете, предоставляет ли он публичный метод clone ().
Но что, если вы программируете для интерфейса, такого как List? Интеллектуальное (рекурсивное) клонирование (по сравнению с копированием данных объекта на уровне байтов) было бы невероятно полезным в среде Collections. Но могут быть коллекции (например, те, которые поддерживаются базой данных), которые не могут поддерживать такую операцию, поэтому вы не можете требовать, чтобы List выставлял открытый клон (). Что побуждает вас к созданию собственной конкретной реализации List для копирования содержимого исходного List.