Шаблон создания прототипа

В java есть и клонируемый интерфейс. Я хочу понять, почему абстрактный класс реализует этот интерфейс, и до сих пор нет реализации метода интерфейса clone() в абстрактном классе?

2 ответа

Решение

В Java есть и клонируемый интерфейс. Я хочу понять, почему абстрактный класс реализует этот интерфейс, в котором до сих пор нет реализации метода интерфейса clone() в абстрактном классе?

Класс объекта обеспечивает реализацию по умолчанию для Objectметоды которых clone() метод.

Когда смотришь Object класс, вы можете видеть, что clone() указывает конкретное ключевое слово в своей подписи: native,

protected native Object clone() throws CloneNotSupportedException;

native К методу применяется ключевое слово, чтобы указать, что оно реализовано в JNIРодной интерфейс Java.
Таким образом, реализация существует где-то (вероятно, в функции C, но не исключительно...), но не напрямую в исходном коде Java метода.

Наконец, вы должны рассмотреть Cloneable interface как то, что он обозначает: маркер interface, Если вы хотите, чтобы ваш объект был клонируемым, реализуйте это, а если вам все равно, ничего не делайте:

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

Теперь, если реализация по умолчанию clone() Метод (мелкая копия) не соответствует тому, как вы хотите клонировать ваш объект, не стесняйтесь переопределять clone() в классе этого объекта.

Интерфейс Cloneable просто для того, чтобы отметить, что класс поддерживает метод clone в Object.clone().

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

Вам не нужно реализовывать этот метод, Object.clone сделает это за вас, в нативном коде:

protected native Object clone() throws CloneNotSupportedException;

Взгляните на эти ссылки: исходный код класса объекта и документы Cloneable Interface.

Несмотря на это, если у вас есть один абстрактный класс на уровне иерархии, вам не нужно реализовывать класс Cloneable in children:

abstract class Animal implements Cloneable {

protected String name;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

class Dog extends Animal {

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}
private int age;

@Override
public Dog clone() throws CloneNotSupportedException {
    return (Dog)super.clone();
}

Клон все еще поддерживается для Java

Другие вопросы по тегам