2011-04-21 95 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; 

如果你想在類成員只有一個副本,創建任意數量的類的對象,那麼你是用靜態方法更好和 - 靜態方法只能操作與靜態成員。

如果你不喜歡靜態方法和靜態成員,單例並不是一個壞的方法。