2010-10-24 29 views
16

我有一个类对象... lat说苹果。在Java中分配对象ID的优雅方式

每个苹果对象都有一个唯一的标识符(ID)...我如何确保(优雅而高效地)新创建的唯一ID。

感谢

+0

你的Apple类是什么样的? – BoltClock 2010-10-24 17:59:38

+3

如何使用UUID? http://download.oracle.com/javase/1.5.0/docs/api/java/util/UUID.html – miku 2010-10-24 18:01:37

+1

你可以创建一个全局计数器,并在构造函数中分配id。我不确定这是否是最好的主意。 – Orbit 2010-10-24 18:01:53

回答

19

在你的苹果类有static int nextId并在构造函数中增加它。

确保递增的代码是原子的可能是谨慎的,所以你可以这样做(使用AtomicInteger)。这将保证如果两个对象完全同时创建,它们不共享相同的ID。

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

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

而不是使用同步,您可以使用原子类型的计数器而不是 – Bwmat 2010-10-24 18:06:20

+1

可能更好使用[AtomicInteger](http://download.oracle.com/javase/6/docs/api/java/util/concurrent/原子/ AtomicInteger.html)这样的东西。 – Pointy 2010-10-24 18:06:31

+1

这不起作用。您最好在'Apple.class'上同步(或者像其他人所建议的那样使用AtomicInteger) – Bozho 2010-10-24 18:06:39

12

使用java.util.UUID.randomUUID()

它不是int,但它保证是唯一的:

表示一个不可变的通用唯一标识符(UUID)的类。


如果你的对象以某种方式(通过某些持久性机制为例)管理,通常是该管理器生成的ID的情况下 - 以一张ID从数据库,例如。

相关:Jeff Atwood's article on GUIDs(UUIDs)。不过,它与数据库相关,但从您的问题中不清楚您是否希望持久化对象。

+2

+1,用于群集安全解决方案。 – 2010-10-24 18:06:38

5

你有没有想过使用UUID类。你可以调用randomUUID()函数每次创建一个新的id。

+0

ahhh Bozho打败了我。 – 2010-10-24 18:05:41

2

还有另一种获取唯一ID的方法。而不是使用int或其他数据类型,只需创建一个类:

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

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

线程安全无需同步!

+1

不错,但不是当需要可比ID时。 – Jarekczek 2012-05-30 13:08:26