Это хорошая причина использовать синглтон? - PullRequest
0 голосов
/ 06 июля 2018

Я делаю приложение для Android, в котором будет расписание местного автобуса. Существует более одного расписания, которое будет использоваться в зависимости от дня.

Если это праздник, я должен использовать специальное расписание, поэтому я хочу знать, когда праздник, а когда нет.

Дело в том, что я создаю класс, который будет обрабатывать это, он будет пытаться извлечь информацию из памяти или из веб-API. Тогда некоторые другие классы смогут общаться с этим классом, но мне не нужно иметь более одного экземпляра этого класса, я мог бы создать только один экземпляр и поделиться им с остальными классами.

Может ли этот класс быть Singleton или было бы лучше, если бы я создал нормальный класс?

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

В вашем случае (извлечение информации из памяти), определенно избегайте использования одноэлементного класса, потому что он, скорее всего, будет привязан к вашему контексту Activity.

Ваш класс будет иметь статическую ссылку на класс, поэтому

  1. он будет храниться в памяти, когда он не нужен.
  2. singleton может быть восстановлен или может использовать устаревший экземпляр с новыми инструкциями действий. Вы потеряете контроль над текущими переменными.
  3. Различные экземпляры одного и того же класса активности могут конфликтовать с этим классом.

Примеры одного и того же класса деятельности нескольких экземпляров:

  1. Изменить ориентацию устройства.
  2. Запуск приложения из браузера, Google Play, файла браузера.

Кроме того, в какой-то момент, когда вы добавите функциональность на основе отзывов пользователей, ваше приложение будет расти, вы, вероятно, захотите реорганизовать свой класс, разбить его на подклассы, поместить некоторые из его методов в отдельные потоки. Это больше не будет легко сделать.

Может показаться забавным, когда приложение маленькое и непроверенное, но позже, особенно в Android, вы столкнетесь с непредсказуемым и трудно выявляемым ошибками.

Из-за особого способа Android воссоздать класс активности через onCreate, onResume и т. Д. Вы столкнетесь с кошмаром, когда приложение начнет жить своей собственной жизнью.

Вы больше не сможете полагаться на предположение о том, что текущий экземпляр Singleton действительно принадлежит вашей текущей деятельности.

Вы можете переключаться между ориентациями или запускать свое приложение из разных точек входа (панель запуска, последние приложения, Google Play), и оно может повторно использовать переменные, фактически подготовленные для другого экземпляра действия.

Если вам нужен только один экземпляр класса, просто создайте один экземпляр класса в методе onCreate - и это сделает приложение намного более управляемым.

0 голосов
/ 06 июля 2018

Одним из основных преимуществ, которые дает вам класс Singleton, является тот факт, что у вас обязательно будет один и только один экземпляр объекта, выполняющего какую-то вещь, и что он создается только один раз (предпочтительно в конкретная точка вашего приложения, например, при запуске или только после выполнения некоторых других операций)

Примером может служить, например, реализация кэша: вы хотите убедиться, что все классы, которым требуется определенный кэш, читают и пишут из одного и того же объекта, который, возможно, создается и заполняется информацией во время запуска.

Похоже, что это не так, если только вы не извлекаете нужную информацию при запуске приложения, а затем по какой-то причине сохраняете ее в памяти: в этом случае вы хотите убедиться, что ваша информация извлекается один и только один раз , чтобы не тратить память и время разработки. Кроме того, синглтон - это хорошо, если вам нужно выполнить какую-то операцию, когда создается экземпляр вашего класса, например, открыть соединение, которое затем остается открытым.

С другой стороны, если вам просто нужен класс с каким-либо методом для вызова некоторого внешнего API или базы данных, и вам не нужно запоминать какую-либо информацию в нем, нет никакой причины инициализировать синглтон.

Если это ваш случай, почему бы вам не попробовать некоторые статические классы / методы? Их можно вызывать, как обычные методы, непосредственно в классе без необходимости создавать экземпляры объектов или сохранять состояние, экономя память и избегая побочных эффектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...