2011-10-05 4 views
7

Мне нужен класс, который создает Объекты, присваивающие ID каждому создаваемому объекту. Этот идентификатор, как обычно, является атрибутом int для класса. Я хочу, чтобы это значение (ID) было увеличено при каждом создании объекта, а затем для этого объекта, начиная с 1. Мне кажется, что мне нужен статический атрибут int.Генератор идентификаторов для созданных объектов

Как инициализировать этот статический атрибут?

Должен ли я создать отдельный метод для инкремента ИД (в качестве генератора идентификаторов), который вызывается внутри конструктора?

Что является наиболее эффективным и хорошо разработанным способом для его реализации?

+1

Просто комментарий: Если вы находитесь в кластерной среде на стороне сервера, этот подход не удастся. – home

ответ

6

Как вы упомяните, используйте идентификатор static int и увеличивайте его при создании новых объектов.

class MyObject { 

    private static int counter = 0; 

    public final int objectId; 

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

Пожалуйста, обратите внимание, что вам нужно, чтобы защитить counter++ если MyObject создаются несколько потоков (например, с использованием AtomicInteger как другие ответы предполагают).

+1

Я думаю, что последнее утверждение должно быть: this.objectId = ++ counter; , Таким образом, первый объект принимает значение 1 для идентификатора, иначе 0. – arjacsoh

+0

@arjacsoh В зависимости от вашего сценария, я бы предпочел, чтобы ids начинались с 0. :) – dacwe

5

Вы также можете попробовать java.util.concurrent.AtomicInteger, который генерирует идентификаторы в

  1. атомного путем и
  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

Смежные вопросы