Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中分配对象id的优雅方式_Java - Fatal编程技术网

Java中分配对象id的优雅方式

Java中分配对象id的优雅方式,java,Java,我有一个对象类。。。我们说苹果 每个apple对象都必须有一个唯一的标识符(id)。。。我如何确保(优雅而高效地)新创建的id是唯一的 感谢您在Apple类中拥有一个静态int-nextId,并在构造函数中增加它 确保递增代码是原子代码可能是谨慎的,因此您可以这样做(使用AtomicInteger)。这将保证如果两个对象完全同时创建,它们不会共享相同的Id public class Apple { static AtomicInteger nextId = new AtomicInteg

我有一个对象类。。。我们说苹果

每个apple对象都必须有一个唯一的标识符(id)。。。我如何确保(优雅而高效地)新创建的id是唯一的


感谢您在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时就不行了。