Приложения 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)


  1. astray0b
    16.09.2024 10:34

    для Activity и для Service система Android выделяет отдельный процесс.

    Совершенно не факт, только если вы специально так настроите.


    1. aamonster
      16.09.2024 10:34
      +2

      Ну, вообще говоря, "не факт" – это ещё хуже. Самое мерзкое слово в тикетах – "sometimes".


      1. astray0b
        16.09.2024 10:34

        Ну так это под контролем разработчика.


    1. clint_eastwood Автор
      16.09.2024 10:34

      да, предложении перед этим говорилось про intentService. уточню для ясности


  1. aamonster
    16.09.2024 10:34
    +5

    Не вижу в описанном автором проблем с синглтоном. Ну да, он один на процесс, а не один на приложение. Так это и требуется (если вам надо разделять какие-то сущности между процессами, даже не создавая что-то, единственное на несколько процессов – надо поднимать IPC, это уже совсем другая история).
    Проблемы с синглтонами известны, и они совсем другие.


    1. clint_eastwood Автор
      16.09.2024 10:34

      повторять сказанное тысячу раз не буду. в статье рассмотрел только проблему в андроиде.
      то что несколько инстансов синглтона в прилоджении это и есть огромная проблема.
      плюс неопределенное поведение Application


      1. aamonster
        16.09.2024 10:34
        +3

        Несколько процессов в приложении – это уже проблема. И если её не понимать и не уметь с ней справляться – синглтон покажется цветочками. А кто умеет – и его будет использовать грамотно (или не будет).