Доступ к полям синглтона через статический метод - PullRequest
5 голосов
/ 27 декабря 2011

У меня есть одноэлементный класс.

При доступе к методам класса у меня есть выбор из двух возможностей.

  1. Создайте эти методы как специфичные для экземпляра, а затем получите экземпляри вызовите их
  2. Создайте эти методы как статические и вызовите их, и они получат экземпляр

Например:

Class Test{

 private int field1;

 Test instance;

 private Test(){};

 private Test getInstance(){
    if (instance == null)
       instance = new Test();
    return instance;
 }

 public int method1() { return field1;}
 public static int method2() {return getInstance().field1;}
}

Теперь в другом месте я могу написать

 int x = Test.getInstance().method1();
 int y = Test.method2();

Что лучше?Я могу придумать третью альтернативу, где я использую «экземпляр» непосредственно в статическом методе, а затем перехватываю исключение, если оно пустое, и создаю его экземпляр, а затем повторно вызываю сам себя.сделать все статичным.Тем не менее, это создаст проблемы при сохранении состояния при закрытии активности, поскольку сериализация не сохраняет статические данные.

Ответы [ 4 ]

2 голосов
/ 27 декабря 2011

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

Чтение: при принятии решения в пользу единственного плана для метода setInstance, а не только дляgetInstance.- Если это не имеет смысла, просто используйте простой статический класс.

С другой стороны, одиночные игры вне сезона, если вы хотите быть модным и все такое.Выполните поиск «, исключая глобальное состояние ».Есть также спонсируемые Google разговоры об этом тоже.Вкратце: ваш код будет более тестируемым и поможет вам избежать хаоса зависимостей.(Помимо того, что он модный и все такое, это определенно шаг в правильном направлении).

2 голосов
/ 27 декабря 2011

Я думаю, что первое - чище.

Однако имейте в виду, что в некоторых крайних случаях Android может убить ваши статические экземпляры.Вот пример: http://code.google.com/p/acra/.

Обходной путь, который я нашел где-то для этого, - это также сохранить ссылку на ваш синглтон из класса Application.Я не знаю, насколько это проблематично.

2 голосов
/ 27 декабря 2011

Вам не следует делать все статичным.Некоторые люди даже скажут, что синглтон не готов.

0 голосов
/ 27 декабря 2011

По моему личному мнению, использование статических методов - это, в первую очередь, плохой дизайн. Это, конечно, зависит от самой программы, но предоставление классу статического метода повлияет на весь дизайн. Некоторые аргументы в пользу моего заявления:

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

Итак, , если можете - избегайте этого .

Если по какой-либо причине вы будете настаивать на статическом методе, я думаю первое решение лучше . Вот как синглтон должен работать. Вы должны получить ссылку на SINGLETON OBJECT статическим методом, но этот объект должен быть , а затем использоваться в соответствии со всеми принципами объектно-ориентированного программирования .

...