Java. Класс Object и его методы. Часть 4 — clone

Продолжаем рассматривать методы класса Object. Один из методов, который, на мой взгляд, мало используется программистами — это clone(). Суть метода в том, что он возвращает объект такого же типа, в котором значения всех полей скопированы. То же самое можно сделать и через конструктор, принимающий объект такого же класса.

Естественно, если сравнить их через == то выдаст false, так как они указывают на разные ссылки. Но сравнение через equals выдаст true.

Вопрос заключается в следующем — зачем писать еще один конструктор, когда сам язык предположил такую возможность? Но, как видим, в классе Object метод clone имеет модификатор доступа protected и это значит, что он недоступен из внешнего класса. Также метод может бросить исключение.

Прочитав документацию (курсор на методе, Ctrl + Q) можно понять, как его использовать.

Нужно реализовать в классе интерфейс Cloneable, который не имеет методов внутри, но он предоставляет классу возможность использовать метод clone и не бросать исключений.

Итак, после имплементации метода, можно изменить мофидикатор доступа у метода clone(), также можно внутри обработать исключение, а не передавать в наружный класс. Итого наш класс примет вид.

Также можно было пометить метод аннотацией @Nullable, хотя мы знаем, что после имплементации интерфейса исключение не должно бросаться. Ради интереса можно убрать интерфейс и посмотреть что будет. Как и ожидалось, видим сообщение об ошибке.

А теперь рассмотрим случай, когда один класс наследуется от другого и мы хотим при клонировании копировать и поля родительского класса. Для этого придется писать в родительском то же самое. Зато можно будет в текущем удалить обертку.

Для deepClone существуют и иные методы (более эффективные и менее эффективные, но простые). Суть проста — записываем данные в поток и читаем их при клонировании.

Давайте посмотрим на метод с SerializationUtils.clone(Object o)

Все вроде как упростилось. В родительском реализовали 1 интерфейс и по сути все. Никаких методов больше не нужно. Но вопрос в скорости, потому что сериализовать объекты долго и «дорого». Но, если у вас действительно большая иерархия классов, то проще использовать этот метод.

Запись опубликована в рубрике Программирование Java. Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *