我需要为每个id
对象创建一个唯一的Person
。
public interface Person
{
String getName();
}
public class Chef implements Person
{
String name;
....
// all other instance variables are not unique to this object.
}
public class Waiter implements Person
{
String name;
....
// all other instance variables are not unique to this object.
}
Chef
内的所有其他实例变量对于特定的Chef
不是唯一的。我们也不能在Chef
类内添加任何额外的变量以使其唯一。这是因为此信息来自后端服务器,并且我无法修改Chef
类。 这是一个分布式系统。
我想创建一个整数,让我可以映射此Person
对象。我试图创建一个“唯一的” id
。
private int makeId(Person person)
{
int id = person.getName()
.concat(person.getClass().getSimpleName())
.hashCode();
return id;
}
但是,我知道这并不是唯一的,因为名称的hashCode不能保证任何唯一性。
如果不使用随机变量,我可以使此id
唯一吗?
我对此误解表示歉意,但是我无法在Chef
或Waiter
对象类中添加更多字段,并且应用已分发。
答案 0 :(得分:10)
如果您的应用程序未分发,则只需在构建过程中使用静态计数器即可:
public class Chef {
private static int nextId = 1;
private final String name;
private final int id;
public Chef(String name){
this.name = name;
this.id = Chef.nextId++;
}
}
第一个Chef
的ID为1,第二个为2,依此类推。
如果您的程序是多线程的,请为AtomicInteger
使用nextId
而不是普通的int
。
请勿将hashCode
用作唯一ID。哈希代码按照定义不一定是唯一的。
答案 1 :(得分:2)
如何添加全局唯一标识符(GUID)?
GUID是一个128位整数(16个字节),可在需要唯一标识符的所有计算机和网络中使用。这样的标识符被复制的可能性非常低。
在Java中,它称为UUID。例如:
UUID uuid = java.util.UUID.randomUUID();
System.out.println(uuid.toString());