Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

Как применить метод clone() класса Object?

#java #объекты #клонирование


Код, написанный мной для тренировки: 

class Korobka {

    public double width, depth, height; //Объявление переменных
    public static int id = 4;

    Korobka(double w, double d, double h) {
        width = w;
        depth = d;
        height = h;
    }

    double volume() {
        return width * depth * height;
    }

    void measurement() {
        System.out.println("Длина коробки " + width);
        System.out.println("Ширина коробки " + depth);
        System.out.println("Высота коробки " + height);
        System.out.println("Объем коробки " + volume());
    }

    public static void main(String[] args) {
        Korobka k1 = new Korobka(4.5, 3.6, 3.7);
        Korobka k2 = new Korobka(4, 5, 6);
        k1.measurement();
        k2.measurement();
        int ID = Korobka.id;
        System.out.println(ID);
    }
}


Вздумалось мне метод clone() из класса Object применить.

Вопросы: 


Могу ли я применить этот метод, к примеру, к коробке k1 (для клонирования)?
Если да, то как это сделать?

    


Ответы

Ответ 1



В дополнение к предыдущим ответам хочу отметить, что лучше реализовать clone() вот так: class Korobka implements Cloneable { @Override public Korobka clone() { try { return (Korobka)super.clone(); } catch( CloneNotSupportedException ex ) { throw new InternalError(); } } //всё остальное } Так как вы интерфейс Cloneable указали, CloneNotSupportedException никогда случиться не должен, и пользователи вашего класса не должны мучаться с ним, оборачивая вызовы в try-catch. Кроме того вы можете быть уверены, что возвращаемый объект имеет тип Korobka и привести тип сами. Тогда пользователи смогут просто писать: Korobka copy = k1.clone(); Вообще у клонирования много проблем и оно не всегда хорошо (хотя бывают случаи, когда очень удобно). Альтернативой клонированию служит конструктор копирования: class Korobka { Korobka(double w, double d, double h) { width = w; depth = d; height = h; } Korobka(Korobka other) { this(other.width, other.depth, other.height); } } Пользоваться тогда немного по-другому: Korobka copy = new Korobka(k1);

Ответ 2



Да сможете. В java объекты передаются по ссылкам. Т.е. следующий код Object o1 = new Object(); Object o2 = o1; создаёт один объект, на который указывают две ссылки. Очень часто это бывает не удобно - изменяем объект о1 изменяется объект о2. А, к примеру, нужно было в объект о2 просто скопировать значения из о1, но никак не связывать их. Для этих целей был введён интерфейс Cloneable. В своём клаccе вам нужно реализовать его: class Korobka implements Cloneable { @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } //всё остальное }

Ответ 3



Для начала нужно, чтобы ваш класс Korobka имплементил маркерный интерфейс Cloneable. Далее, вам надо переопределить метод clone() и сделать его публичным. Тогда вы сможете где угодно в своем коде клонировать коробки. P.S. Прежде чем переопределять метод, почитайте про глубокое копирование объектов в Java. Хотя оно тут не пригодится, но всё равно почитайте.

Комментариев нет:

Отправить комментарий