Java中分配对象id的优雅方式
我有一个对象类。。。我们说苹果 每个apple对象都必须有一个唯一的标识符(id)。。。我如何确保(优雅而高效地)新创建的id是唯一的Java中分配对象id的优雅方式,java,Java,我有一个对象类。。。我们说苹果 每个apple对象都必须有一个唯一的标识符(id)。。。我如何确保(优雅而高效地)新创建的id是唯一的 感谢您在Apple类中拥有一个静态int-nextId,并在构造函数中增加它 确保递增代码是原子代码可能是谨慎的,因此您可以这样做(使用AtomicInteger)。这将保证如果两个对象完全同时创建,它们不会共享相同的Id public class Apple { static AtomicInteger nextId = new AtomicInteg
感谢您在Apple类中拥有一个
静态int-nextId
,并在构造函数中增加它
确保递增代码是原子代码可能是谨慎的,因此您可以这样做(使用AtomicInteger)。这将保证如果两个对象完全同时创建,它们不会共享相同的Id
public class Apple {
static AtomicInteger nextId = new AtomicInteger();
private int id;
public Apple() {
id = nextId.incrementAndGet();
}
}
使用
java.util.UUID.randomUUID()
它不是int
,但保证是唯一的:
表示不可变的通用唯一标识符(UUID)的类
如果您的对象是以某种方式管理的(例如通过某种持久性机制),那么管理器通常会生成id,例如从数据库中获取下一个id
相关:(UUIDs)。虽然它与数据库相关,但您的问题并不清楚您是否希望对象被持久化。您是否考虑过使用类。每次都可以调用randomUUID()函数来创建新的id 还有另一种获取唯一ID的方法。不使用int或其他数据类型,只需创建一个类:
final class ID
{
@Override
public boolean equals(Object o)
{
return this==o;
}
}
public Apple
{
final private ID id=new ID();
}
线程安全,无需同步 你的
Apple
类是什么样子的?使用UUID怎么样?您可以创建一个全局计数器,并在构造函数中分配id。我不确定这是不是最好的主意。我很好奇为什么你最终使用了AtomicInteger。如果重新启动应用程序,则应用程序会将nextId重置为0。这就是你想要的吗?不用synchronized,你可以使用原子类型来代替计数器。对于这样的东西,使用原子类型可能更好。这样不行。你最好在Apple上同步。class
(或者像其他人建议的那样使用AtomicInteger
)为了安全起见,最好将静态字段也声明为“private”nextId
应该是private,而id
应该是final。很好,但当需要可比的id时就不行了。