2010-11-07 59 views
0

在我最初設計它時,在下面的代碼片段中,需要「下一個數字」在應用程序執行過程中發送下一個遞增值。所以我讓這個課變成了一個單身人士。然而,隨着最近需求的一些變化,我需要重新設置「下一個數字」。我剛剛添加了一個重置​​方法來做到這一點。但是,它肯定違反了Singleton模式,並且我知道用這種方式初始化一個靜態成員並不是一個好主意。帶初始化靜態成員的單身人士

您認爲我應該怎麼做?

public final class GetNextNumber { 
    private static GetNextNumber instance; 
    private static Integer nextNumber=1; 
    private GetNextNumber() { 
    } 
    public static synchronized GetNextNumber getInstance() { 
     if(instance==null){ 
      instance = new GetNextNumber(); 
     } 
     return instance; 
    } 
    protected Integer getNextNumber(){ 
     return nextNumber++; 
    } 
    protected synchronized void reset(){ 
     nextNumber=1; 
    } 
    public Object clone() throws CloneNotSupportedException { 
     throw new CloneNotSupportedException(); 
    } 
} 
+1

你並不需要一個clone()方法。它所做的就是重現默認行爲。由於你的班級是最終的,並且不實施Cloneable,所以無論如何都沒有任何其他行爲。它也使克隆()公開而不是保護,在這種情況下,這是徒勞的。 – EJP 2010-11-07 00:11:37

回答

2

爲什麼不是字段只是實例變量?這裏不需要靜態。

重置不需要同步,除非getNextNumber也是。

2

看起來不錯,我 - 除了兩件事情:

  • getNextNumber不​​。
  • 因爲getNextNumberreset不是static,nextNumber也不需要是static

你可以使用一個AtomicInteger,以避免讓你的getNextNumberreset方法​​:

public final class GetNextNumber { 

    private static GetNextNumber instance; 

    private AtomicInteger nextNumber = new AtomicInteger(1); 

    private GetNextNumber() { 
    } 

    public static synchronized GetNextNumber getInstance() { 
     if(instance==null){ 
      instance = new GetNextNumber(); 
     } 
     return instance; 
    } 

    protected Integer getNextNumber(){ 
     return nextNumber.getAndIncrement(); 
    } 

    protected void reset(){ 
     nextNumber.set(1); 
    } 
} 

獲得進一步的討論,請參閱:例如The Atomic classes in Java 5: AtomicInteger and AtomicLong

前的Java 5 ,我們不得不編寫類 訪問計數器變量 ​​塊或方法ds或 其他變量使用volatile變量,即 是一種較輕的同步形式,但有 ,如果某些更新同時發生,可能會丟失一些更新。 一個AtomicInteger可以作爲一個 簡易替換,提供了 兩全其美...