2011-04-21 63 views
1

我需要在我的应用程序中使用一个全局计数器,该计数器为每个请求增加计数。我打算把这个计数器在一个单独的类是这样的:单身VS与静态变量

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

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

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

+0

类似于:http://stackoverflow.com/questions/5582881/singleton-and-static-utility-classes – 2011-04-21 15:36:39

+0

在你上面发布的代码中,使'update()'和'getCount() )'静态的。因为count是静态变量,所以你不需要'this.count'。 – kunal 2011-04-21 15:38:00

+0

纠正它.. – Pan 2011-04-21 15:48:56

回答

5

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


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

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

,这样就可以做

import static Counter.COUNTER; 

int num = COUNTER.incrementAndGet(); 
2

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

+2

+1:如果你可以根据需要创建一个计数器,我只会使用一个AtomicInteger – 2011-04-21 15:40:30

+0

我不是一个Java的人,但看着这个类,我会说这是要走的路。没有必要写一些已经存在和测试过的东西! – Kendrick 2011-04-21 15:45:23

1

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

1

没有看到这是一个标签为Java而不是C++的问题; 反正我会把它留在这里,除非有人想要删除它。

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

在你上面的代码中,利用getCount()方法,你

return this.count;

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

 
return count; 

如果你想在类成员只有一个副本,创建任意数量的类的对象,那么你是用静态方法更好和 - 静态方法只能操作与静态成员。

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