在主题中,我可以在 Java 中将对象字段标记为唯一吗?我想在课堂上拥有唯一的 id。
4 回答
您可以使用静态变量创建唯一 ID,该变量在每次创建对象时递增并分配给您的 ID 变量:
private static int globalID = 0;
private int ID;
public obj()
{
globalID++;
this.ID = globalID;
}
不,那是不可能的。您必须在 Controller 类中管理它。
当您不关心唯一字段的内容时,除了它们必须是唯一的,您可以使用 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。
如果您希望通过众所周知的框架(例如 Hibernate)为持久化类指定唯一 ID,您可以通过HBM 映射或@Id 注释来实现。
如果您希望确保特定 Class 的实例是唯一的(从运行时的角度来看),那么您应该覆盖 .equals 方法并根据您用作“唯一 id”的字段在 .equals 中进行比较类”。如果您想要某种特定字段是您的“唯一 ID”的开发时间指示器,您总是可以创建自定义注释。
这是来自不同 StackOverflow 帖子的 excellet 答案,关于如何使用 Apache Commons Lang library 覆盖 .equals 和 .hashCode。您可以使用它,只需修改 .equals 覆盖以比较您用作“唯一 ID”的任何字段。