我需要在我的应用程序中使用一个全局计数器,它会根据每个请求递增计数。我打算将这个计数器放在一个单独的类中:
public class Counter{
private static int count = 0;
public synchronized static update()
{
count += 1;
}
public synchronized static int getCount()
{
return count;
}
}
在整个应用程序的生命周期中只存在一个计数器。因为只有一个单身人士,我可以通过单身人士获得任何好处吗?创建单个实例而不是具有静态变量的类更有意义吗?会有什么好处
答案 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;
如果你只想要一个类成员的副本,对于任何数量的类对象创建,那么你最好使用静态方法 - 静态方法只能用静态成员操作。
如果你不喜欢静态方法和静态成员,单例不是一个坏方法。