簡體   English   中英

單例與靜態變量

[英]Singleton Vs static variable

我需要在我的應用程序中使用一個全局計數器,該計數器會為每個請求增加計數。 我將把這個計數器放在一個單獨的類中,如下所示:

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

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

在應用程序的整個生命周期中,僅存在一個計數器。 既然有一個單身人士,我會從中獲得任何好處嗎? 創建單個實例而不是使用帶有靜態變量的類是否更有意義? 有什么好處

我將其設為靜態(字段和方法),或者設為非靜態。 您似乎有一個必定會造成混淆的組合。


在這種情況下,我將只使用AtomicInteger

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

這樣你就可以

import static Counter.COUNTER;

int num = COUNTER.incrementAndGet();

我認為沒有必要將其設置為單例或靜態。 在邏輯位置(正在生成請求的類的實例變量?)實例化一個新的Counter ,然后從那里使用它。 這樣, Counter類在您需要時仍可在其他地方重用,而您不必擔心其他人會抓取和更新您的Counter ...

當類具有狀態(具有字段)時,使用單例更為常見。 當類是無狀態的時,它是一個實用程序類,通常其方法是靜態的。

沒有看到這是用Java而不是C ++標記的問題; 無論如何,除非有人要刪除它,否則我將其留在這里。

關於靜態類成員的事情是,它們與類而不是類實例緊密耦合。 換句話說,靜態變量只有一個內存分配,該內存分配將在此類的所有實例(類對象)之間共享。

在上面的代碼中,在getCount()方法中,您可以

return this.count;

請記住,靜態成員沒有此指針,這意味着從類外部進行訪問時將使用classname :: static_member對其進行訪問,並且在定義類方法時僅使用變量名,就像上面所做的那樣。 因此,您的代碼應類似於:

return count;

如果只需要一個類成員的副本,那么對於創建的任何數量的類對象,最好使用靜態方法,並且-靜態方法只能對靜態成員進行操作。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM