Типа Object или того типа, объект которого мы клонируем? Интересует есть ли тут подводные камни? Какие есть ограничения для применения каждого из способов. Ниже два примера для понимания о чем речь:
1) public Object clone() {...}
2) public Test1 clone() {...}
Сергей Белов
25 уровень
Какого типа ссылку должен возвращать переопределенный метод clone() ?
Обсуждается
Комментарии (2)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
DmitryK #853142832
20 декабря 2022, 11:02
До Java 5 метод clone не мог сужать возвращаемый тип, поэтому всегда возвращал Object. Сейчас такого ограничения нет, но в исходниках Java (в ArrayList.clone(), например) встречаются места, где clone возвращает Object - это сделано для совместимости.
Читал на гитхабе, что сейчас хорошим тоном считается возвращать тип того класса, в котором clone реализован.
Если возвращаете как Object, то объект надо кастовать до Test1, иначе, как написал Михаил, будем ограничены тем перечнем методов, что есть в Object (но при этом реализация будет вызвана из Test1).
Подводные камни - клонирование само по себе подводный камень. Например, при клонировании не вызывается конструктор, а конструктор - гарант валидной инициализации полей объекта. Клонирование может быть опасной операцией, т.к. по умолчанию это поверхностое клонирование. Для примитивов мы получаем истинные копии, но для объектов мы получаем лишь копии ссылок на них, а не копии самих объектов - т.е. клон и оригинал будут иметь ссылки на одни и те же объекты. Например, упомянутый выше ArrayList.clone() хоть вернёт вам новый список, но объекты в нём будут те же, что и в оригинале.
+2
Михаил
20 декабря 2022, 10:04
Если метод clone() будет возвращать Object, то мы расширяем Test1 до Object, то есть будут доступны только методы определенные в классе родителе, то есть Object (Object - является родителем для всех объектов в Java). Java Core 4.3 Приведение типов. Расширение и сужение
+2