Тот факт, что клон защищен, чрезвычайно сомнителен, как и тот факт, что метод clone
не объявлен в интерфейсе Cloneable
.
Это делает метод довольно бесполезным для получения копий данных, потому что вы не можете сказать :
if(a instanceof Cloneable) {
copy = ((Cloneable) a).clone();
}
Я думаю, что дизайн Cloneable
сейчас в значительной степени рассматривается как ошибка (цитата ниже). Обычно я хотел бы иметь возможность создавать реализации интерфейса Cloneable
, но не обязательно должен создавать интерфейс Cloneable
(аналогично использованию Serializable
). Это не может быть сделано без размышления:
ISomething i = ...
if (i instanceof Cloneable) {
//DAMN! I Need to know about ISomethingImpl! Unless...
copy = (ISomething) i.getClass().getMethod("clone").invoke(i);
}
Цитата из Эффективная Java Джоша Блоха :
"Интерфейс Cloneable был задуман как смешанный интерфейс для объектов, объявляющих о том, что они разрешают клонирование. К сожалению, он не предназначен для этой цели ... Это очень нетипичное использование интерфейсов, а не тот, который нужно эмулировать ... Чтобы реализация интерфейса оказала какое-либо влияние на класс, он и все его суперклассы должны подчиняться довольно сложному, неисполнимому и в значительной степени недокументированному протоколу"