2010-10-24 3 views
16

У меня есть класс для объектов ... говорят яблоки яблоки.Элегантный способ присвоить идентификатор объекта в Java

Каждый мундштук из яблока имеет уникальный идентификатор (id) ... как я могу обеспечить (элегантно и эффективно), что только что созданный имеет уникальный идентификатор.

Благодаря

+0

Как выглядит ваш класс 'Apple'? – BoltClock

+3

Как насчет использования UUID? http://download.oracle.com/javase/1.5.0/docs/api/java/util/UUID.html – miku

+1

вы можете создать глобальный счетчик и назначить идентификатор в конструкторе. Я не уверен, что это лучшая идея. – Orbit

ответ

19

имеют static int nextId в классе Apple, и увеличивать его в конструкторе.

Возможно, было бы разумно обеспечить, чтобы ваш инкрементирующий код был атомарным, поэтому вы можете сделать что-то подобное (используя AtomicInteger). Это гарантирует, что, если два объекта создаются точно в одно и то же время, они не используют один и тот же идентификатор.

public class Apple { 
    static AtomicInteger nextId = new AtomicInteger(); 
    private int id; 

    public Apple() { 
     id = nextId.incrementAndGet(); 
    } 
} 
+1

Вместо использования синхронизации вы можете использовать атомный тип для счетчика вместо – Bwmat

+1

Может быть приятнее использовать [AtomicInteger] (http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ atom/AtomicInteger.html) для чего-то подобного. – Pointy

+1

это не сработает. Лучше синхронизировать с 'Apple.class' (или использовать' AtomicInteger', как предлагалось другим) – Bozho

12

Использование java.util.UUID.randomUUID()

Это не int, но гарантированно быть уникальным:

Класс, который представляет неизменный универсально уникальный идентификатор (UUID).


Если объекты какие-то образом (например, с помощью какого-то механизма сохранения), часто бывает так, что менеджер генерирует идентификаторы - принимать следующий идентификатор из базы данных, например.

Относно: Jeff Atwood's article on GUIDs (UUIDs). Однако это связано с базой данных, но из вашего вопроса неясно, хотите ли вы сохранить ваши объекты или нет.

+2

+1 для безопасного решения кластера. –

5

Вы подумали об использовании класса UUID. Вы можете вызвать функцию randomUUID() для создания нового идентификатора каждый раз.

+0

ahhh Bozho избил меня. –

2

Существует еще один способ получить уникальные идентификаторы. Вместо того, чтобы использовать int или другой тип данных, просто введите класс:

final class ID 
{ 
    @Override 
    public boolean equals(Object o) 
    { 
    return this==o; 
    } 
} 

public Apple 
{ 
    final private ID id=new ID(); 
} 

Нитки без синхронизации!

+1

Приятно, но не тогда, когда нужно сопоставить идентификаторы. – Jarekczek

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