2012-11-26 105 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

如果你冷静下来,你能否澄清你对于答案错误的看法? –