我需要一个创建对象,为每个创建的对象分配一个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