2011-10-05 99 views
7

我需要一個創建對象,爲每個創建的對象分配一個ID。此ID與通常一樣,是該類的一個int屬性。我希望這個值(ID)在每次創建一個對象時被增加,然後被分配給從1開始的對象。它讓我感到需要一個靜態的int屬性。創建對象的ID生成器

我該如何初始化這個靜態屬性?

我應該創建一個單獨的方法來執行在構造函數中調用的ID(作爲ID生成器)的增量嗎?

什麼是總體上最有效和精心設計的方式來實現呢?

+1

只是一個評論:如果你在服務器端集羣環境中,這種方法將失敗。 – home

回答

6

就像你提到的那樣使用id爲static int,並在創建新對象時增加它。

class MyObject { 

    private static int counter = 0; 

    public final int objectId; 

    MyObject() { 
     this.objectId = counter++; 
    } 
} 

請注意,你需要保護counter++如果MyObject由多個線程創建(例如使用AtomicInteger爲其他答案建議)。

+1

我認爲最後的陳述必須是:this.objectId = ++ counter; 。這樣,第一個對象的ID爲1,否則爲0. – arjacsoh

+0

@arjacsoh取決於您的場景,然而我更喜歡ID以0開頭。:) – dacwe

5

您也可以嘗試java.util.concurrent.AtomicInteger,它產生於

  1. ID的原子方式
  2. 順序

你可以像一個靜態的上下文中使用這樣的:

private static final AtomicInteger sequence = new AtomicInteger(); 
private SequenceGenerator() {} 

public static int next() { 
    return sequence.incrementAndGet(); 
} 
4

我會建議使用AtomicInteger,這是線程安全的

class MyObject 
{ 
    private static AtomicInteger uniqueId=new AtomicInteger(); 
    private int id; 

    MyObject() 
    { 
     id=uniqueId.getAndIncrement(); 
    } 

} 
+0

爲什麼要使用getAndIncrement()而不是incrementAndGet()?它只是var ++和++ var之間的區別嗎? – EarthMind