В вашем случае да, вы можете переопределить clone()
:
public class A {
}
public class B extends A implements Cloneable {
@Override
public B clone() throws CloneNotSupportedException {
return (B) super.clone();
}
}
и до сих пор эффективный механизм клонирования - вы поэтому говорить правду, когда вы заявляете implements Cloneable
.
Однако все, что необходимо для разрыва этого обещания, должно дать A
переменную private
.
public class A {
private int a;
}
и теперь ваше обещание нарушается - если А не реализует clone
, в этом случае вы можете использовать super.clone()
:
public class A {
private int a;
@Override
public A clone() throws CloneNotSupportedException {
A newA = (A) super.clone();
newA.a = a;
return newA;
}
}
public class B extends A implements Cloneable {
private int b;
@Override
public B clone() throws CloneNotSupportedException {
B newB = (B) super.clone();
newB.b = b;
return newB;
}
}
По сути - Джошуа Блох утверждает, - если вы не реализуете clone
ваш суб -классы также не могут (вообще).
Используйте конструктор копирования. – Everv0id
Да, я понимаю, что конструктор копирования - лучший способ скопировать объект ..thanks :) –
Для других: альтернативой конструктору копирования является [static newInstance()] (http://www.javapractices.com/topic /TopicAction.do?Id=12) идиома. Но я нахожу это любопытным. Почему бы просто не сделать свой класс собственной фабрикой и использовать нестатический метод 'newInstance()? Кажется более чистым, чем передача существующего объекта в качестве параметра; как объект для копии самого себя (без использования сломанного 'clone()'). –