我可以在Java中将对象字段标记为唯一的吗
在主题中,我可以将对象字段标记为Java中唯一的吗?我想在类中拥有唯一的id。不,这是不可能的。您必须在控制器类中管理它。不,这是不可能的。您必须在控制器类中对其进行管理。您可以使用静态变量创建唯一的ID,该静态变量在每次对象创建时递增,并分配给ID变量:我可以在Java中将对象字段标记为唯一的吗,java,unique,Java,Unique,在主题中,我可以将对象字段标记为Java中唯一的吗?我想在类中拥有唯一的id。不,这是不可能的。您必须在控制器类中管理它。不,这是不可能的。您必须在控制器类中对其进行管理。您可以使用静态变量创建唯一的ID,该静态变量在每次对象创建时递增,并分配给ID变量: private static int globalID = 0; private int ID; public obj() { globalID++; this.ID = globalID; } 可以使用静态变量创建唯一的ID,
private static int globalID = 0;
private int ID;
public obj()
{
globalID++;
this.ID = globalID;
}
可以使用静态变量创建唯一的ID,该静态变量在每次对象创建时递增,并分配给ID变量:
private static int globalID = 0;
private int ID;
public obj()
{
globalID++;
this.ID = globalID;
}
当你不关心你的唯一字段的内容,只关心它们必须是唯一的时,你可以使用nukebauer的解决方案 但是,如果要手动设置值,并在该值已被类的另一个实例使用时引发异常,则可以在静态集中跟踪指定的值:
class MyObject {
private Integer id;
private static Set<Integer> assignedIds = new HashSet<Integer>();
public void setId(int id) throws NotUniqueException {
if (!this.id.equals(id) {
if (assignedIds.contains(id) {
throw new NotUniqueException();
}
assignedIds.add(id);
this.id = id;
}
}
}
顺便说一下:请注意,这两个选项都不是线程安全的!这意味着,当两个线程在完全相同的时间创建实例/设置ID时,它们可能仍会获得相同的ID。如果要在多线程环境中使用此功能,您应该将代码包装在一个同步块中,该块在静态变量上进行同步。如果您不关心唯一字段的内容,只关心它们必须是唯一的,您可以使用nukebauer的解决方案 但是,如果要手动设置值,并在该值已被类的另一个实例使用时引发异常,则可以在静态集中跟踪指定的值:
class MyObject {
private Integer id;
private static Set<Integer> assignedIds = new HashSet<Integer>();
public void setId(int id) throws NotUniqueException {
if (!this.id.equals(id) {
if (assignedIds.contains(id) {
throw new NotUniqueException();
}
assignedIds.add(id);
this.id = id;
}
}
}
顺便说一下:请注意,这两个选项都不是线程安全的!这意味着当两个线程在完全相同的时间创建实例/设置ID时,它们可能仍然获得相同的ID。当您希望在多线程环境中使用此ID时,您应该将代码包装在同步块中,该块在静态变量上同步。您的问题有点模糊,但我将试图根据有限的信息来回答这个问题 我想在类中有唯一的id 如果希望通过Hibernate之类的知名框架为类指定一个唯一的ID以实现持久性,那么可以通过or来实现 如果您希望确保某个特定类的实例从运行时的角度来看是唯一的,那么您应该重写.equals方法,并基于用作该类唯一id的字段在.equals中进行比较。如果您想要某种类型的开发时间指示器,即特定字段是您的唯一ID,那么您可以始终创建一个自定义注释
下面是另一个StackOverflow帖子中关于这个问题的excellet回答。您可以使用此选项,只需修改.equals覆盖,以比较您使用的唯一ID的任何字段。您的问题有点模糊,但我将根据有限的信息尝试回答它 我想在类中有唯一的id 如果希望通过Hibernate之类的知名框架为类指定一个唯一的ID以实现持久性,那么可以通过or来实现 如果您希望确保某个特定类的实例从运行时的角度来看是唯一的,那么您应该重写.equals方法,并基于用作该类唯一id的字段在.equals中进行比较。如果您想要某种类型的开发时间指示器,即特定字段是您的唯一ID,那么您可以始终创建一个自定义注释
下面是另一个StackOverflow帖子中关于这个问题的excellet回答。您可以使用此选项,只需修改.equals覆盖,就可以对用作唯一ID的任何字段进行比较。对对象的引用是对象的唯一ID。@PicklishDoorknob hashCode不是唯一的。@MarkoTopolnik,如果你管理得当的话is@PicklishDoorknob如何正确地管理它?@MarkoTopolnik会覆盖所有比较对象的内容。对对象的引用是对象的唯一id。@PicklishDoorknob hashCode不是唯一的。@MarkoTopolnik很好,如果你管理得当的话is@PicklishDoorknob你如何正确地管理它?@MarkoTopolnik会为你所做的一切覆盖它comparing@user1825608每个对象都有一个hashCode方法。重写它并使其返回您的ID。@user1825608每个对象都有一个hashCode方法。重写它并使其返回您的ID。使用私有静态最终AtomicLong ID和ID.incrementAndGet重写。使用私有静态最终AtomicLong ID和ID.incrementAndGet重写。您不担心由此造成的内存泄漏吗?当您要确保在应用程序的整个生命周期内不使用任何值两次时,这是没有办法的。当您希望允许重用不再需要的实例所使用的ID时,需要手动将其ID从集合中删除。不幸的是java不支持像C++、S这样的析构函数。
o在实例离开作用域之前,您必须确保在实例上调用一些空闲方法。Java确实支持弱引用,这正是它们的使用情况。您不担心这会造成内存泄漏吗?如果您想确保在应用程序的整个生命周期中不使用任何值两次,那么就没有办法了。当您希望允许重用不再需要的实例所使用的ID时,需要手动将其ID从集合中删除。不幸的是,java不支持C++之类的析构函数,所以在离开它们之前,必须确保在实例上调用一些免费的方法。java确实支持弱引用,而这正是它们的使用情况。