Прежде всего, обратите внимание, что интерфейс clone() не работает. , поэтому его не следует использовать в новом коде. Вместо этого лучше реализовать конструктор(ы) копирования.
Однако, если вам действительно нужно это сделать, правильным способом будет TopMost
реализовать Cloneable
. Почему? Говорит эффективное Java 2-е издание, пункт 11:
Так что же делает Cloneable
, если он не содержит методов? Он определяет поведение защищенной реализации clone
класса Object
: если класс реализует Cloneable
, метод clone класса Object
возвращает копию объекта "поле за полем"; в противном случае выдается CloneNotSupportedException
. Это крайне нетипичное использование интерфейсов, и его не следует эмулировать. Обычно реализация интерфейса что-то говорит о том, что класс может сделать для своих клиентов. В случае Cloneable
он изменяет поведение защищенного метода в суперклассе.
Причем Asub.clone
нужно объявлять public
, а не protected
- иначе из внешнего мира его не вызвать. Кроме того, если вы используете Java5 или выше, для Asub.clone
допустимо и желательно возвращать Asub
, а не Object
(и аналогично для его суперклассов).
Вы не показываете членов в классах — реализации clone
в различных классах могут сильно различаться в зависимости от типов членов в этом классе. А именно, если у класса есть какие-либо изменяемые члены, вам нужно тщательно скопировать их все, иначе вы получите отдельные объекты, разделяющие их внутреннее состояние.
Однако, предположим, что ваши классы имеют только примитивные или неизменяемые поля, клонирование работает, как и ожидалось, хотя у вас есть много ненужных методов clone
в ваших абстрактных классах, все из которых просто вызывают super.clone()
- вам может быть лучше только Asub.clone()
.
В качестве примечания: если Top a = (Top) super.clone()
не является опечаткой, вы вводите зависимость от базового класса к производному классу, что не является хорошей идеей.
person
Péter Török
schedule
06.09.2010