Объекты-синглтоны должны существовать в приложении только в одном экземпляре. Метод clone() представляет угрозу безопасности, потому что может создавать дубликаты экземпляров, нарушая паттерн синглтон.
Есть два рекомендуемых подхода, чтобы запретить клонирование объектов-синглтонов:
Самое простое решение — не реализовывать интерфейс Cloneable. По умолчанию, если класс не реализует Cloneable, вызов clone() выбросит CloneNotSupportedException, что естественным образом предотвратит любые попытки дублирования.
Если твой синглтон должен реализовывать Cloneable по другим причинам, переопредели метод clone(), чтобы выбросить исключение:
@Override
protected Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException(
"Cloning is not permitted for Singleton objects"
);
}
Этот подход гарантирует, что:
Избегай реализации Cloneable по возможности — это самое чистое и простое решение. Используй подход с выбросом исключения только если твой дизайн требует интерфейс Cloneable для других целей.
Контролируя доступ к методу clone(), ты гарантируешь соблюдение инварианта синглтона — на протяжении всего жизненного цикла приложения существует только один экземпляр объекта.
Если singleton класс не реализует интерфейс Cloneable, вызов clone() автоматически выбросит CloneNotSupportedException.
Новый — ещё не проверен сообществом
Вы