每当创建新对象时生成唯一的int

时间:2017-01-23 13:57:32

标签: java

我想创建一个类:

class Student {
private static int id;
}  

每次创建Student对象时,都会为该学生分配一个唯一的6位数ID。

我在Stack Overflow上发现的其他相关问题并没有那么有用。

2 个答案:

答案 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将不再可用。你也可以实现它,但在你的情况下这可能就足够了。