Java 如何在创建对象时自动在构造函数中分配变量
假设我们有一个简单的对象Person,它具有int-ID来标识它。如何为Person的每个新实例(但在该类Person的构造函数中)提供新的ID值(+1)?(我对此不使用DB)使用静态变量;静态变量不绑定到类实例,而是直接绑定到类 例如(用C#表示): 这样,所有类实例都将具有唯一的ID-s(递增1)Java 如何在创建对象时自动在构造函数中分配变量,java,Java,假设我们有一个简单的对象Person,它具有int-ID来标识它。如何为Person的每个新实例(但在该类Person的构造函数中)提供新的ID值(+1)?(我对此不使用DB)使用静态变量;静态变量不绑定到类实例,而是直接绑定到类 例如(用C#表示): 这样,所有类实例都将具有唯一的ID-s(递增1) 编辑:这种方法不是线程安全的,请参见@Mudu的答案。使用静态变量;静态变量不绑定到类实例,而是直接绑定到类 例如(用C#表示): 这样,所有类实例都将具有唯一的ID-s(递增1) 编辑:这种方法
编辑:这种方法不是线程安全的,请参见@Mudu的答案。使用静态变量;静态变量不绑定到类实例,而是直接绑定到类 例如(用C#表示): 这样,所有类实例都将具有唯一的ID-s(递增1)
编辑:这种方法不是线程安全的,请参见@Mudu的答案。使用静态的
原子整数:
final class Foo {
private static final AtomicInteger seed = new AtomicInteger();
private final int id;
public Foo() {
this.id = seed.incrementAndGet();
}
}
有关更多信息,请参见此处:使用静态原子整数
:
final class Foo {
private static final AtomicInteger seed = new AtomicInteger();
private final int id;
public Foo() {
this.id = seed.incrementAndGet();
}
}
有关更多信息,请参见此处:您应该使用
public class YourClass {
private static int generalIdCount = 0;
private int id;
public YourClass() {
this.id = generalIdCount;
generalIdCount++;
}
}
你应该使用类似于
public class YourClass {
private static int generalIdCount = 0;
private int id;
public YourClass() {
this.id = generalIdCount;
generalIdCount++;
}
}
使用静态计数字段,该字段在人员的所有实例中共享:
class Person {
private static int nextId = 1;
private final int id;
Person() {
id = nextId++;
}
}
使用静态计数字段,该字段在人员的所有实例中共享:
class Person {
private static int nextId = 1;
private final int id;
Person() {
id = nextId++;
}
}
您可以为当前计数器值创建一个静态变量,并在创建时将其分配给ID
public class Person {
// same across all instances of this class
static int currentCounter = 0;
// only for this instance
int personId;
public Person(){
personId = currentCounter;
currentCounter++;
}
}
您可以为当前计数器值创建一个静态变量,并在创建时将其分配给ID
public class Person {
// same across all instances of this class
static int currentCounter = 0;
// only for this instance
int personId;
public Person(){
personId = currentCounter;
currentCounter++;
}
}
但这不是线程安全的,使用公共变量也不是一个好主意,也不是遵循Java命名约定,但是只要你不使用多线程就可以了。这个解决方案没有考虑到Person
构造函数的线程调用。@JonSkeet-在他的辩护中,他说这是一个C#示例,我想你可以自己提供一个Java答案?@Neil:是的-我错过了,因为我看到这是一个Java问题。它仍然不是线程安全的,或者在C中遵循良好的设计原则(虽然:)(已经有一个很好的Java答案建议AtomicInteger。)但这不是线程安全的,使用公共变量也不是一个好主意,也不是遵循Java命名约定。请记住,这不是线程安全的,但是只要你不使用多线程就可以了。这个解决方案没有考虑到Person
构造函数的线程调用。@JonSkeet-在他的辩护中,他说这是一个C#示例,我想你可以自己提供一个Java答案?@Neil:是的-我错过了,因为我看到这是一个Java问题。它仍然不是线程安全的,或者在C中遵循良好的设计原则:)(已经有一个很好的Java答案建议AtomicInteger。)@Mudu-s答案是线程安全的,而所有其他答案(包括我的答案,尽管我的答案是第一个)都不是。@Mudu-s答案是线程安全的,而所有其他答案都是线程安全的(包括我的答案在内都是完全相同的,尽管我的答案是第一个)不是。是。我想这取决于作者选择最适合他们上下文的答案,尽管像@Mudu这样的线程安全答案会考虑所有上下文。谢谢你的反馈。是。我想这取决于作者选择最适合他们上下文的答案,尽管像e@Mudu将考虑所有上下文。感谢您的反馈。