Синглтон против статической переменной - PullRequest
1 голос
/ 21 апреля 2011

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

public class Counter{  
  private static int count = 0;  
  public synchronized static update()
  {
    count += 1;
  }  

  public synchronized static int getCount()
  {
    return count;
  }  
}

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

Ответы [ 4 ]

5 голосов
/ 21 апреля 2011

Я бы сделал это либо статичным (поле и методы), либо нет. У вас, кажется, есть комбинация, которая может сбить с толку.


В этом случае я бы просто использовал AtomicInteger:

public enum Counter {
    public static final AtomicInteger COUNTER = new AtomicInteger();
}

так что вы можете сделать

import static Counter.COUNTER;

int num = COUNTER.incrementAndGet();
2 голосов
/ 21 апреля 2011

Я не вижу необходимости делать его одиночным или статическим. Создайте новый Counter в логическом месте (переменная экземпляра класса, который генерирует запросы?) И используйте его оттуда. Таким образом, класс Counter по-прежнему можно использовать в другом месте, если он вам нужен, и вам не нужно беспокоиться о том, чтобы кто-нибудь еще захватил и обновил ваш счетчик ...

1 голос
/ 21 апреля 2011

Не увидел, что это вопрос с тегом Java, а не C ++; В любом случае я оставлю это здесь, если кто-то не хочет, чтобы это удалили.

Особенность статических членов класса заключается в том, что они тесно связаны с классом, а не с экземпляром класса. Другими словами, для статической переменной имеется только одно выделение памяти, которое будет совместно использоваться всеми экземплярами этого класса (объектами класса).

В приведенном выше коде в методе getCount () вы

return this.count;

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

return count;

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

Если вам не нравятся статические методы и статические члены, синглтон - не плохой подход.

1 голос
/ 21 апреля 2011

Чаще всего используется синглтон, когда у класса есть состояние (у него есть поля). Когда класс не имеет состояния - это служебный класс, и обычно его методы являются статическими.

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