Почему нет по умолчанию clone () в Cloneable в Java 8

Cloneable в Java по своей сути нарушен. В частности, моя самая большая проблема с интерфейсом - это ожидаемое поведение метода, которое не определяет сам метод. Так что если пройти черезCloneable список, вы должны использовать отражение, чтобы получить доступ к его определенному поведению. Однако в Java 8 у нас теперь есть методы по умолчанию, и теперь я спрашиваю, почему по умолчанию нетclone() метод вCloneable.

Я понимаю почемуинтерфейсы не могут использовать методы объекта по умолчаниюоднако это было явное дизайнерское решение, и поэтому могут быть сделаны исключения.

Я вроде представляю, как осуждающийObject.clone() и изменив его внутренний код на что-то вроде:

if(this instanceof Cloneable) {
    return ((Cloneable) this).clone();
}
else {
    throw new CloneNotSupportedException();
}

И двигаться на то, что делает волшебствоclone() сделать свое дело как метод по умолчанию вCloneable, Это на самом деле не исправитьclone() может все еще быть легко осуществлено неправильно, но это - другое обсуждение само по себе.

Насколько я могу, это изменение будет полностью обратно совместимо:

Классы, которые в настоящее время переопределяютclone() но не реализовалCloneable (ПОЧЕМУ ?!) все равно будет технически нормально (даже если функционально невозможно, но это ничем не отличается от того, что было раньше).Классы, которые в настоящее время переопределяютclone(), но реализовалCloneable будет по-прежнему функционировать так же в его реализации.Классы, которые в настоящее время не переопределяютclone(), но реализовалCloneable (ПОЧЕМУ ?!) теперь будет следовать спецификации, даже если это не такполностью функционально правильно.Те, которые использовали отражение и ссылались наObject.clone() будет по-прежнему функционально работать.super.clone() все равно будет функционально таким же, даже если он ссылаетсяObject.clone().

Не говоря уже о том, что это решило бы огромную проблемуCloneable является. Хотя это утомительно и все еще легко реализовать неправильно, это решило бы огромную объектно-ориентированную проблему с интерфейсом.

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

Обсуждается ли это внутри, но так и не было реализовано? Если так, то почему? Если по той причине, что интерфейсы не могут использовать методы объекта по умолчанию, не имеет смысла делать исключение в этом случае, поскольку все объекты наследуютCloneable ожидаютclone() тем не мение?

Ответы на вопрос(2)

Ваш ответ на вопрос