Открытый интерфейс клонирования Java - PullRequest
3 голосов
/ 17 июля 2011

Есть ли что-то плохое или неправильное в создании такого интерфейса и его использовании в месте, где мне нужно убедиться, что переменная клонируема?

public interface PublicCloneable<I> {
    public I clone();
}

Вопросы в SO связаны с тем, что Cloneable интерфейс Java нарушен, и я не понимаю, почему он не реализован таким образом.

Ответы [ 3 ]

2 голосов
/ 18 июля 2011

Можно. Основная проблема с созданием нового интерфейса состоит в том, что вы можете использовать этот интерфейс только на новых классах, которые вы создаете, которые явно реализуют этот интерфейс. Существующие классы в библиотеке Java не могут реализовать этот интерфейс, так как вы не можете изменить их код. (Интерфейс волшебным образом не применяется к существующим типам.) Поэтому он полезен только в том случае, если вы создаете семейство пользовательских классов для всех объектов, которые ожидаете использовать, и не используете стандартные библиотечные классы.

1 голос
/ 18 июля 2011

Если вы хотите полностью реализовать собственную реализацию clone(), все должно быть в порядке. Однако, если вы хотите использовать Object.clone () в какой-то момент, я бы порекомендовал

public interface PublicCloneable<I> extends Cloneable {
    public I clone();
}

и внутренняя реализация:

   public static class MyClass implements PublicCloneable<MyClass> {
     public MyClass clone() {
        try {
            return (MyClass)super.clone(); // Or do whatever you need here
        } catch (CloneNotSupportedException e) {
            // Always supported
        }
   }

Я не был уверен, что он скомпилируется, но я попытался, и, кажется, все в порядке.

Пробег может меняться, конечно.

1 голос
/ 18 июля 2011

Это хорошо, но вы должны будете предоставить свою собственную логику клонирования внутри метода.

Идея java.lang.Cloneable состоит в том, чтобы пометить класс как клонируемый, а логику клонирования обработать JVM,Полевое клонирование не предоставляется с помощью Object.clone()

. Вы можете выбрать другой механизм клонирования (или использовать свой интерфейс в сочетании с другим) из предложенных в в этом ответе * 1008.*.

...