2016-12-07 23 views
3

Я нахожусь в процессе перехода на java из C++ и считаю себя java noob. Недавно я смотрел на обширную базу кода с несколькими примерами вида public class Myclass implements Cloneable{...} без реализации функции clone. Я не понимаю преимуществ этого шаблона. Есть ли какие-нибудь? Если вы решите не реализовывать функцию clone, зачем вывести ее из Cloneable? Также есть ли какие-либо ломбок-анотации, которые предоставляют некоторые функции по умолчанию clone?Java Cloneable без реализации

+0

«Cloneable» - это пример того, что называется [интерфейсом маркера] (https://en.wikipedia.org/wiki/Marker_interface_pattern). Сегодня это, возможно, было бы отмечено с помощью аннотации, но тогда они не существовали в Java. –

+0

'Cloneable' - это старый интерфейс маркера. Правильный и очень простой ответ - просто «не использовать». Никто не делает. См. Http: //www.artima.com/intv/bloch13.html Для удобства, легко переварить ответы на такие вопросы и помочь вам с вашей миграцией, получить и листать _Effective Java_. – pvg

ответ

1

Если класс не реализует интерфейс Cloneable, вызов clone на экземпляр класса приводит к CloneNotSupportedException. java.lang.Object уже реализует метод clone (этот метод не является абстрактным), поэтому для его реализации не требуются подклассы. Метод clonejava.lang.Object выполняет мелкую копию экземпляра.

+1

Но не метод clone, защищенный в классе объектов. Это должно автоматически запретить любым пользователям MyClass вызывать функцию клонирования. – cplusplusrat

+1

Правильно, но поскольку он защищен, подклассы могут ссылаться на него в своей реализации. Если другим классам нужно это назвать, это может быть переоценено и сделано «публичным». – manouti

+1

Итак, точка реализации интерфейса «Cloneable» без предоставления реальной реализации заключается в том, чтобы избежать того, чтобы подклассы вызывали функцию «clone» из базового класса Object? – cplusplusrat

0

Существует на самом деле @Wither аннотаций в Ломбок: https://projectlombok.org/features/experimental/Wither.html

Но вы также можете просто создать новый объект, передавая параметры в конструктор.

+0

« Но вы также можете просто создать новый объект передавая параметры конструктору ". Это не будет автоматически создавать правильный класс объекта для подклассов. – newacct

1

Если вы решите не реализовывать функцию клонирования, зачем ее извлекать из Cloneable?

Метод clone() не вытекает из интерфейса Cloneable.
Он исходит из класса Object.
Cloneable - это просто интерфейс маркера.
Используется во время выполнения для действительного поведения, если метод clone() вызывается в экземпляре класса.
Java выбрала модель дизайна, где по умолчанию объект владеет методом clone(). Это выбор дизайна, который вам может понравиться или нет, но в любом случае это так:
Конкретно, если вы вызываете clone() на объект, а класс объекта не реализует Clonable, JVM во время выполнения выдает исключение CloneNotSupportedException. Точно так же некоторые классы бросают UnsupportedOperationException, если один из их методов не реализован.

Также есть какая-либо Ломбки АННОТАЦИЯ, которые обеспечивают клонировать некоторые настройки по умолчанию функции?

По умолчанию clone() выполняет мелкую копию текущего объекта. То есть создается новый экземпляр для объекта, который вы клонируете, но все поля объектов, которыми он владеет, не клонируются. Действительно, поля клонированного объекта все же ссылаются на те же объекты, что и в исходном экземпляре. Будут клонированы только поля с примитивными типами (int, float, boolean и т. Д.).
Если вам нужно иметь другое поведение в методе clone(), Ломбок не может догадаться, каково поведение, которое вы хотите иметь. Таким образом, нет смысла использовать его для генерации реализации метода clone().

+0

«Конкретно, если вы вызываете clone() на объект, а класс объекта не реализует Clonable, JVM во время выполнения выдает исключение CloneNotSupportedException». Только если метод 'clone()' объекта каким-то образом использует 'Object.clone()'. Если класс реализует 'clone()' таким образом, который не использует 'Object.clone()', то реализуется ли «Cloneable» или нет. – newacct