Генератор идентификаторов для созданных объектов - PullRequest
9 голосов
/ 05 октября 2011

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

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

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

Каков наиболее эффективный и продуманный способ реализации этого?

Ответы [ 3 ]

8 голосов
/ 05 октября 2011

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

class MyObject {

    private static int counter = 0;

    public final int objectId;

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

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

6 голосов
/ 05 октября 2011

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

  1. атомным путем и
  2. последовательный

Вы можете использовать это в статическом контексте, например:

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

public static int next() {
    return sequence.incrementAndGet();
}
5 голосов
/ 05 октября 2011

Я бы предложил использовать AtomicInteger, который является поточно-ориентированным

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

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...