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

时间:2012-11-21 13:04:28

标签: java unique

在主题中我可以在Java中将对象字段标记为唯一吗?我希望在课堂上有独特的身份。

4 个答案:

答案 0 :(得分:3)

您可以使用静态变量创建唯一ID,该静态变量在每个对象创建时递增并分配给您的ID变量:

private static int globalID = 0;
private int ID;
public obj()
{
   globalID++;
   this.ID = globalID;
}

答案 1 :(得分:1)

不,那是不可能的。您必须在Controller类中进行管理。

答案 2 :(得分:0)

如果您不关心您的唯一字段的内容,除非它们必须是唯一的,您可以使用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。如果要在多线程环境中使用它,则应将代码包装在同步块中,该块同步静态变量。

答案 3 :(得分:0)

您的问题有点模糊,但我会尝试根据有限的信息来回答。

  

我希望在课堂上拥有唯一的ID。

如果您希望通过众所周知的框架(如Hibernate)为类保留持久性的唯一ID,则可以通过HBM mapping@Id annotation执行此操作。

如果您希望确保特定类的实例是唯一的(从运行时的角度来看),那么您应该覆盖.equals方法并根据您使用的字段在.equals中进行比较。 “班级的独特身份”。如果您想要某种开发时间指示器,特定字段是您的“唯一ID”,您可以随时创建自定义注释。

以下是来自不同StackOverflow帖子的关于how to override .equals and .hashCode using the Apache Commons Lang library的excellet答案。您可以使用此功能,只需修改.equals覆盖即可比较您使用的任何字段作为“唯一ID”。