Почему нет по умолчанию 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()
тем не мение?