我想创建一个类:
class Student {
private static int id;
}
每次创建Student
对象时,都会为该学生分配一个唯一的6位数ID。
我在Stack Overflow上发现的其他相关问题并没有那么有用。
答案 0 :(得分:0)
您可以使用static
方法,该方法依赖于Student类中的static
int
字段。
如果Student
构造函数调用中存在竞争条件:
public class Student {
private static int currentId = 0;
private static final int MAX_VAUE_ACCEPTED = 999999;
private static Object lock = new Object();
private static int getNewId() {
synchronized(lock){
if (currentId > MAX_VAUE_ACCEPTED) {
// handling the problem because you is over 6 digits
}
currentId++;
return currentId;
}
}
...
private int id;
public Student(){
this.id = getNewId();
}
}
如果你没有任何竞争条件,那就是同样的事情,但没有同步。
作为旁注,如果使用数值来存储信息,如果要在所有情况下都有6位数的表示,则应该转换为String以呈现id。
因为例如000001
不是您自然来自数字的表示。你宁愿:1
如果需要,您应该有一个方法使转换呈现id。
答案 1 :(得分:0)
您可以定义一个ID
类,其中getID
方法每次调用时都会返回一个新的6位数ID:
class ID {
private int id = 0;
private final int max;
private final String pattern;
public ID(int digits) {
this.max = (int) Math.pow(10, (digits));
this.pattern = "%0" + digits + "d";
}
public synchronized String getID() {
if(!(id < max)) throw new IllegalStateException("Too many IDs");
return String.format(pattern, id++);
}
}
(在此处使用String
出于格式化原因,您不需要以任何方式使用ID进行计算。)
然后,在Student
课程中,您只需创建一个static ID
,并在需要新ID时拨打getID
。
class Student {
private static final ID idFactory = new ID(6);
private final String id = idFactory.getId(); // will always get called for new Student
...
}
但是,如果Student
对象被垃圾收集,则它的ID将不再可用。你也可以实现它,但在你的情况下这可能就足够了。