2012-11-26 104 views
1

我有一個類(如下)。我有類的字段ID,但我不知道如何使這創建一個唯一的ID順序增加。Make class生成短序列唯一ID

我發現UUID.randomUUID();會以非常不友好的方式生成一個唯一的ID,並且無法限制大小。

我怎麼能實現一些東西來增加id字段作爲對象從下面的類創建?

class Customer { 

public int id; 
public String name; 
public String email; 
public String number; 
public String issue; 
public String expiry; 

Customer(String eName, String eEmail, String eNumber, String eIssue, String eExpiry) 
{ 
    id = 0935091285; 
    name = eName; 
    email = eEmail; 
    number = eNumber; 
    issue = eIssue; 
    expiry = eExpiry; 
} 
} 
+2

在這種情況下,您可以使用靜態變量。這樣您也可以知道創建了多少個對象。將id設爲靜態。 – Addict

+0

'UUID.randomUUID()'如何生成ID「不友好」? –

+0

當我想要的是一個簡短的數字ID時,它是不友好的,沒有辦法控制randomUUID()的輸出。 –

回答

4

不指定是否有多個進程同時生成的ID。如果不這樣做,下面是簡單的將工作做好:

public class Customer { 
    private static AtomicInteger nextId = new AtomicInteger(0); 
    private static String getNextId() { 
    return Integer.toString(nextId.incrementAndGet()); 
    } 
    public Customer(...) { 
    id = getNextId(); 
    ... 
    } 
} 

格式的數字標識與領先的零,如果你想IDS的字典順序,以反映對象的創建順序。

+0

雖然真的很好,但這個解決方案根本不能擴展。同一個應用程序的兩個實例可以/會生成相同的ID。 –

+2

@ColinHebert:當然。我認爲問題在於這個問題的使用背景並不清楚。 – NPE

1

我不確定我明白爲什麼UUID生成器不能滿足您的需求。大小是固定的(36個字符)。我可以理解,非順序部分可能是一個問題,但。

如果你需要連續生成唯一的標識符(並且假設你已經嘗試了UUID,我想你已經嘗試了一個簡單的增量系統),並且可能在大範圍內推薦你看看snowflake ,這是Twitter用來生成順序但不增量ID的服務。

基本上這是一個簡單的服務器就可以運行,當你需要它會爲你生成唯一標識符:用Scala編寫

  • 節儉服務器
  • ID組成:

    • 時間 - 41位(毫秒精度w /一個自定義曆元給我們69年)
    • 配置機器ëID - 10位 - 使我們高達1024臺機器
    • 序列號 - 12位 - 軋每4096個每機(帶保護以避免 側翻在相同毫秒)

資源:

+0

如果你冷靜下來,你能否澄清你對於答案錯誤的看法? –