Singleton Vs静态变量

时间:2011-04-21 15:33:44

标签: java singleton

我需要在我的应用程序中使用一个全局计数器,它会根据每个请求递增计数。我打算将这个计数器放在一个单独的类中:

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

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

在整个应用程序的生命周期中只存在一个计数器。因为只有一个单身人士,我可以通过单身人士获得任何好处吗?创建单个实例而不是具有静态变量的类更有意义吗?会有什么好处

4 个答案:

答案 0 :(得分:5)

我会将它设为静态(字段和方法)或不是。你似乎有一个必然会混淆的组合。


在这种情况下,我只想使用AtomicInteger

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

这样你就可以了

import static Counter.COUNTER;

int num = COUNTER.incrementAndGet();

答案 1 :(得分:2)

我认为没有必要让它成为单身或静态。在逻辑点(生成请求的类的实例变量?)中实例化一个新的Counter并从那里使用它。这样,Counter课程仍然可以在其他地方重复使用,如果你需要它,你不必担心其他人抓住并更新你的计数器......

答案 2 :(得分:1)

当类具有状态(它具有字段)时,更常见的是使用单例。当类是无状态时 - 它是一个实用类,通常它的方法是静态的。

答案 3 :(得分:1)

没有看到这是一个用Java而不是C ++标记的问题; 无论如何,除非有人想要将其删除,否则我会留在这里。

关于静态类成员的事情是它们与类紧密耦合而不是类实例。换句话说,静态变量只有一个内存分配,它将在该类的所有实例(类对象)之间共享。

在上面的代码中,在getCount()方法中,您

return this.count;

请记住,静态成员没有这个指针,这意味着当从类外部访问时,使用classname :: static_member访问它们,并在定义类方法时使用变量名,就像上面所做的那样。 所以你的代码应该类似于:

return count;

如果你只想要一个类成员的副本,对于任何数量的类对象创建,那么你最好使用静态方法 - 静态方法只能用静态成员操作。

如果你不喜欢静态方法和静态成员,单例不是一个坏方法。