Java-документации говорит:Вопрос о Cloneable интерфейса и исключения, которые должны быть брошенной
класс реализует интерфейс Cloneable для указания метода Object.clone(), что является законным для этот способ сделать поле для копирования экземпляров этого класса. Метод клона
ссылающегося объекта на экземпляре, который не реализует Cloneable результатов интерфейса в исключения CloneNotSupportedException бросок.
По соглашению, классы, которые реализуют этот интерфейс должен переопределить Object.clone (защищенный) с публичным методом. Дополнительную информацию об переопределении этого метода см. В Object.clone() .
Обратите внимание, что этот интерфейс не содержит , содержащий метод клонирования. Поэтому невозможно клонировать объект только в силу того, что он реализует этот интерфейс. Даже если метод clone вызывает рефлексивно, нет гарантии, что он достигнет .
И у меня есть этот UserProfile
класс:
public class UserProfile implements Cloneable {
private String name;
private int ssn;
private String address;
public UserProfile(String name, int ssn, String address) {
this.name = name;
this.ssn = ssn;
this.address = address;
}
public UserProfile(UserProfile user) {
this.name = user.getName();
this.ssn = user.getSSN();
this.address = user.getAddress();
}
// get methods here...
@Override
public UserProfile clone() {
return new UserProfile(this);
}
}
И для тестирования porpuses, я делаю это в main()
:
UserProfile up1 = new UserProfile("User", 123, "Street");
UserProfile up2 = up1.clone();
До сих пор никаких проблем с компиляцией/погонный. Теперь, по моему пониманию документации, удаление implements Cloneable
из класса UserProfile
должно вызвать исключение в вызове up1.clone()
, но это не так.
Я читал здесь, что интерфейс Cloneable сломан, но я действительно не знаю, что это значит. Я что-то упускаю?
Cloneable является проблематичным, поскольку Cloneable интерфейс не имеет метода клон(), вам необходимо либо знать конкретный тип, который реализует метод Clone() (в этом случае вам конкретный тип, так что вы вместо этого может использовать конструктор копирования), или вам нужно использовать отражение. Любой API, который требует отражения для правильной работы, может быть описан как сломанный. –
Будьте осторожны: в методе clone не вызывайте конструктор, а вызывайте (UserProfile) super.clone(). См. Http://java.sun.com/javase/6/docs/api/java/lang/Object.html#clone%28%29 «По соглашению ...» – Istao