2

任何人都知道如何id从 1 开始生成,以便下一个对象有 2 等等?

我尝试了以下但不起作用:

class students{

    private int id;
    private String name;

    public student(String name){
        this.id=id++;
        this.name
    }
}
4

3 回答 3

4

您需要一个静态类成员来跟踪上次使用的索引。一定要实现一个复制构造函数:

class students
{
    private static int next_id = 0;   // <-- static, class-wide counter

    private int id;                   // <-- per-object ID

    private String name;

    public students(String name)
    {
        this.id = ++students.next_id;
        this.name = name;

        // ...
    }

    public students(students rhs)
    {
        this.id = ++students.next_id;
        this.name = rhs.name;

        // ...
    }

    public static void reset_counter(int n)  // use with care!
    {
        students.next_id = n;
    }

    // ...
}

更新:正如@JordanWhite 建议的那样,您可能希望将静态计数器设为atomic,这意味着它可以安全地同时使用(即一次在多个线程中使用)。为此,将类型更改为:

private static AtomicInteger next_id = new AtomicInteger(0);

增量和读取操作和复位操作变为:

this.id = students.next_id.incrementAndGet();  // like "++next_id"

students.next_id.set(n);                       // like "next_id = n"
于 2012-09-09T02:22:19.497 回答
4

请注意,使用静态变量来跟踪您的计数器在非常有限的情况下工作。

您不能在多台机器上运行此代码,例如,如果它是一个 Web 应用程序,那么它是一个 Web 集群。此外,静态变量是瞬态的,将在您重新启动应用程序时重置。

生成顺序 ID 的常见解决方案是使用数据库。大多数数据库都有内置的方法来做到这一点。例如,IDENTITY在 SQL Server 或AUTO_INCREMENTMySQL 中。

考虑使用像 Hibernate 这样的持久性框架,您可以声明许多经过验证的策略之一,例如身份、hilo 或 uuid,其中一些是顺序的,而另一些则不是。有些是由应用程序生成的,有些是由数据库生成的,但权衡是有据可查的,您会知道自己在做什么。

于 2012-09-09T03:22:24.083 回答
0

你应该private int id;改变 toprivate static int id;id++to ++id

你可以试试:

class Students{
    private static int id;
    private String name;
    public Students(String name){
    this.id=++id; // this.id +=1;may be better 
    System.out.println(this.id);
    this.name = name;
   }
}

测试代码:

public class Test {
public static void main(String[] args) {
    Students s1 = new Students("Mark1");
    Students s2 = new Students("Mark2");
}

}

于 2012-09-09T02:34:28.397 回答