В интерфейсе Cloneable
нет метода clone()
.Как @ Иван указывает на , если ваш класс не реализует Cloneable
, тогда вызов Single#clone()
выдаст CloneNotSupportedException
.
Это сказалоКлонирование - это то, что редко происходит в хорошо написанной Java в наши дни.Как пишет Джош Блох в Effective Java , Item 11:
Интерфейс Cloneable
был задуман как mixin interface (Item 18) для объектоврекламировать, что они разрешают клонирование.К сожалению, он не служит этой цели.Его основной недостаток - отсутствие метода clone
, а метод клонирования Object
защищен.Вы не можете, не прибегая к рефлексии (пункт 53), вызывать метод clone
для объекта только потому, что он реализует Cloneable
.Даже рефлексивный вызов может потерпеть неудачу, поскольку нет гарантии, что объект имеет доступный метод clone
.Несмотря на этот и другие недостатки, средство широко используется, поэтому стоит его понять.
... в основном люди не / не должны использовать clone()
.Это плохо спроектированный интерфейс, и если вы хотите, чтобы ваши объекты были клонируемыми, лучше предоставить конструктор копирования или метод фабрики копирования (код, украденный из элемента 11):
public Yum(Yum yum); // copy constructor
public static Yum newInstance(Yum yum); // copy factory
И пока яЯ имею в виду Эффективная Java , есть лучший способ написать синглтон, при условии, что вам действительно нужен один (что очень важно!).
Начиная с версии 1.5, существует третий подход к реализации синглетонов.Просто создайте тип enum с одним элементом:
// Enum singleton - the preferred approach
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() { ... }
}
Этот подход функционально эквивалентен подходу открытого поля, за исключением того, что он более лаконичен, предоставляет механизм сериализации бесплатно и обеспечивает железную оболочкугарантия от множественных реализаций, даже перед лицом сложных сериализаций или атак отражения.Хотя этот подход еще не получил широкого распространения, одноэлементный тип перечисления является лучшим способом реализации синглтона.