我需要一個創建對象,爲每個創建的對象分配一個ID。此ID與通常一樣,是該類的一個int屬性。我希望這個值(ID)在每次創建一個對象時被增加,然後被分配給從1開始的對象。它讓我感到需要一個靜態的int屬性。創建對象的ID生成器
我該如何初始化這個靜態屬性?
我應該創建一個單獨的方法來執行在構造函數中調用的ID(作爲ID生成器)的增量嗎?
什麼是總體上最有效和精心設計的方式來實現呢?
我需要一個創建對象,爲每個創建的對象分配一個ID。此ID與通常一樣,是該類的一個int屬性。我希望這個值(ID)在每次創建一個對象時被增加,然後被分配給從1開始的對象。它讓我感到需要一個靜態的int屬性。創建對象的ID生成器
我該如何初始化這個靜態屬性?
我應該創建一個單獨的方法來執行在構造函數中調用的ID(作爲ID生成器)的增量嗎?
什麼是總體上最有效和精心設計的方式來實現呢?
就像你提到的那樣使用id爲static int
,並在創建新對象時增加它。
class MyObject {
private static int counter = 0;
public final int objectId;
MyObject() {
this.objectId = counter++;
}
}
請注意,你需要保護counter++
如果MyObject
由多個線程創建(例如使用AtomicInteger
爲其他答案建議)。
您也可以嘗試java.util.concurrent.AtomicInteger,它產生於
你可以像一個靜態的上下文中使用這樣的:
private static final AtomicInteger sequence = new AtomicInteger();
private SequenceGenerator() {}
public static int next() {
return sequence.incrementAndGet();
}
我會建議使用AtomicInteger
,這是線程安全的
class MyObject
{
private static AtomicInteger uniqueId=new AtomicInteger();
private int id;
MyObject()
{
id=uniqueId.getAndIncrement();
}
}
爲什麼要使用getAndIncrement()而不是incrementAndGet()?它只是var ++和++ var之間的區別嗎? – EarthMind
只是一個評論:如果你在服務器端集羣環境中,這種方法將失敗。 – home