Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.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中将对象字段标记为唯一的吗_Java_Unique - Fatal编程技术网

我可以在Java中将对象字段标记为唯一的吗

我可以在Java中将对象字段标记为唯一的吗,java,unique,Java,Unique,在主题中,我可以将对象字段标记为Java中唯一的吗?我想在类中拥有唯一的id。不,这是不可能的。您必须在控制器类中管理它。不,这是不可能的。您必须在控制器类中对其进行管理。您可以使用静态变量创建唯一的ID,该静态变量在每次对象创建时递增,并分配给ID变量: private static int globalID = 0; private int ID; public obj() { globalID++; this.ID = globalID; } 可以使用静态变量创建唯一的ID,

在主题中,我可以将对象字段标记为Java中唯一的吗?我想在类中拥有唯一的id。

不,这是不可能的。您必须在控制器类中管理它。

不,这是不可能的。您必须在控制器类中对其进行管理。

您可以使用静态变量创建唯一的ID,该静态变量在每次对象创建时递增,并分配给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确实支持弱引用,而这正是它们的使用情况。