2011-10-05 52 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