2010-10-24 50 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