Приложения Android обычно работают в рамках одного процесса, разделяя память и системные ресурсы. Однако Android предоставляет разработчикам гибкость для запуска отдельных компонентов — таких как Activities, Services, or BroadcastReceivers — в отдельных процессах. Система Android не гарантирует, что Singleton, написанный в приложении, будет действительно единственным.
Вот почему Singleton не является паттерном или антипаттерном программирования. Это чистое зло. Особенно в разработке Android. Если на собеседовании разработчика просят назвать известные ему паттерны, а он первым называет Singleton, то на этом собеседование можно заканчивать. Серьёзно.
И в этой статье я расскажу вам, почему.
Давайте представим, что у нас есть Singleton.
object Singleton
Будет ли один и тот же экземпляр объекта Singleton в Activity и IntentService или Service?
Ответ - НЕТ.
Потому что для каждого Android компонента система может создать свой процесс. А для IntentService отдельный процесс выделяется по умолчанию.
Кроме того, класс Application будет создан заново. В некоторых случаях Application создаст новый экземпляр класса Application. В некоторых случаях метод onCreate будет вызван несколько раз.
Вы можете проверить это, поиграв с настройкой android:process в файле Manifest.
Подведем итоги:
никогда не используйте Singleton в своем приложении;
будьте готовы к тому, что класс Application может иметь несколько экземпляров;
метод onCreate может быть вызван несколько раз.
Комментарии (7)
aamonster
16.09.2024 10:34+5Не вижу в описанном автором проблем с синглтоном. Ну да, он один на процесс, а не один на приложение. Так это и требуется (если вам надо разделять какие-то сущности между процессами, даже не создавая что-то, единственное на несколько процессов – надо поднимать IPC, это уже совсем другая история).
Проблемы с синглтонами известны, и они совсем другие.clint_eastwood Автор
16.09.2024 10:34повторять сказанное тысячу раз не буду. в статье рассмотрел только проблему в андроиде.
то что несколько инстансов синглтона в прилоджении это и есть огромная проблема.
плюс неопределенное поведение Applicationaamonster
16.09.2024 10:34+3Несколько процессов в приложении – это уже проблема. И если её не понимать и не уметь с ней справляться – синглтон покажется цветочками. А кто умеет – и его будет использовать грамотно (или не будет).
astray0b
Совершенно не факт, только если вы специально так настроите.
aamonster
Ну, вообще говоря, "не факт" – это ещё хуже. Самое мерзкое слово в тикетах – "sometimes".
astray0b
Ну так это под контролем разработчика.
clint_eastwood Автор
да, предложении перед этим говорилось про intentService. уточню для ясности