Java-Doc говорит о Object.clone()
:
Создает и возвращает копию этого объекта. Точное значение
«копия» может зависеть от класса объекта.
Это зависит от вашей реализации метода clone()
, какую копию или клон вы получите. Но Java-Doc говорит дальше:
По соглашению, объект, возвращаемый этим методом, должен быть
независимо от этого объекта (который клонируется).
В соответствии с этим соглашением, клон будет другим независимым экземпляром чего-то, что раньше было экземпляром синглтона.
Продолжаем работать с Java-Doc:
Класс Object сам по себе не реализует интерфейс Cloneable, поэтому
вызов метода clone для объекта, класс которого Object
приводит к генерации исключения во время выполнения.
Итак, вы должны явно объявить, что ваш класс implements Cloneable
. Пока вы этого не сделаете, в вашем экземпляре нет открытого метода clone()
. Но вы не сделаете этого для синглтона, поскольку это сделает ваш дизайн класса (синглтон) бесполезным.
Если вы не объявили одноэлементный класс final
и расширили его другим классом, экземпляр которого будет вызывать super.clone()
, это приведет к выбросу упомянутого CloneNotSupportedException
.
Если вы явно объявите, что ваш синглтон-класс implements Cloneable
в соответствии с Java-Doc, это:
создает новый экземпляр класса этого объекта и инициализирует все
его поля с точно содержимым соответствующих полей
этот объект как бы по заданию; содержимое полей не
сами клонировали. Таким образом, этот метод выполняет "мелкую копию" этого
объект, а не операция "глубокого копирования".
Чтобы получить правильный клон, Java-Doc Cloneable
говорит:
... классы, которые реализуют этот интерфейс, должны переопределять Object.clone ... Следовательно, невозможно клонировать объект только в силу того факта, что он реализует этот интерфейс.
Так что вам действительно нужно это сделать явно .
Отвечая на вопрос:
Является ли это возможным? Да, но только если вы позволите.
Это предназначено? Нет.
Также обратите внимание:
Помимо упомянутого выше, используя отражение, вы можете попытаться обойти ограничения видимости одноэлементного класса для создания дополнительных экземпляров.