Вопрос об интерфейсе Cloneable и исключении, которое должно быть выброшено - PullRequest
2 голосов
/ 22 мая 2010

Документация Java гласит:

Класс реализует интерфейс Cloneable для указания методу Object.clone (), что для этого метода допустимо делать копию поля для поляэкземпляры этого класса.

Вызов метода клона Object в экземпляре, который не реализует интерфейс Cloneable, приводит к исключению CloneNotSupportedException.

По соглашению классы, реализующие этот интерфейс, должны переопределять Object.clone (который защищен) публичным методом.См. Object.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Интерфейс не работает, но я не знаю, что это значит.Я что-то упустил?

Ответы [ 3 ]

5 голосов
/ 22 мая 2010

Теперь, согласно моему пониманию документации, удаление implements Cloneable из класса UserProfile должно вызывать и исключение при вызове up1.clone(), но это не так.

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

Реализация clone() в классе Object - это то, что вызывает исключение, но вы переопределили этот метод.

1 голос
/ 22 мая 2010

Я согласен с обоими ответами и кое-что добавляю: интерфейс подобен тегу, чтобы сказать, что ваш класс реализует clone ().Это полезно в API-подобных методах, когда вы не знаете тип объекта.Тогда вы можете написать

if (myobj instanceof Cloneable) { dosmthng(); }
1 голос
/ 22 мая 2010

Это означает, что если вы реализуете Cloneable и опускаете метод clone (), а затем вызываете метод clone (), возникает исключение.

РЕДАКТИРОВАТЬ : Это было упомянуто, вероятно, 1 миллиард раз раньше, но

НЕ ИСПОЛЬЗУЙТЕ МЕТОД КЛОНА!

Если вам нужна функциональность клонирования, вместо этого предоставьте конструктор копирования.

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

...