Что такое паттерн Singleton
Что проверяют
Понимаете ли вы назначение и знаете ли, чем он плох.
Как отвечать
Порождающий шаблон, обеспечивающий единственный экземпляр класса и глобальную точку доступа к нему.
Назначение: разделяемый ресурс, который дорого создавать или который обязан быть один. Кэш, пул соединений, конфигурация, клиент сети, служба аналитики.
Реализация в Kotlin тривиальна: объявление объекта создаёт потокобезопасный ленивый экземпляр без единой строки шаблонного кода. В Java классические варианты это двойная проверка с изменчивым полем либо перечисление из одного значения, которое даёт защиту и от сериализации, и от отражения.
Проблемы, которые надо назвать, иначе ответ неполный:
- это глобальное изменяемое состояние. Любая часть программы может его изменить, и отследить, кто это сделал, сложно;
- скрытая зависимость. По сигнатуре класса не видно, что он обращается к синглтону, поэтому неочевидно, что нужно для его работы;
- невозможно подменить в тесте, потому что обращение идёт напрямую к классу. Приходится городить сброс состояния между тестами, и оно всё равно протекает;
- живёт до конца работы приложения. В Android это прямой путь к утечке: хранение контекста активити в синглтоне удерживает экран навсегда;
- потокобезопасность ложится на вас, если внутри есть изменяемое состояние.
Отсюда современный ответ: то же самое достигается внедрением зависимостей с областью жизни на всё приложение. Экземпляр по-прежнему один, но зависимость объявлена явно в конструкторе, подменяется в тесте одной строкой, а время жизни управляется контейнером, а не языком.
Итог: единственность экземпляра это нормальное требование, а вот глобальная точка доступа к нему это плохой способ его реализовать.
Где спотыкаются
Называют преимуществом экономию памяти, хотя дело в разделяемом состоянии.
Хранят в синглтоне контекст активити.
Не могут написать корректную потокобезопасную реализацию на Java.
Не знают, что контейнер зависимостей решает ту же задачу без недостатков.