Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在创建对象时自动在构造函数中分配变量_Java - Fatal编程技术网

Java 如何在创建对象时自动在构造函数中分配变量

Java 如何在创建对象时自动在构造函数中分配变量,java,Java,假设我们有一个简单的对象Person,它具有int-ID来标识它。如何为Person的每个新实例(但在该类Person的构造函数中)提供新的ID值(+1)?(我对此不使用DB)使用静态变量;静态变量不绑定到类实例,而是直接绑定到类 例如(用C#表示): 这样,所有类实例都将具有唯一的ID-s(递增1) 编辑:这种方法不是线程安全的,请参见@Mudu的答案。使用静态变量;静态变量不绑定到类实例,而是直接绑定到类 例如(用C#表示): 这样,所有类实例都将具有唯一的ID-s(递增1) 编辑:这种方法

假设我们有一个简单的对象Person,它具有int-ID来标识它。如何为Person的每个新实例(但在该类Person的构造函数中)提供新的ID值(+1)?(我对此不使用DB)

使用静态变量;静态变量不绑定到类实例,而是直接绑定到类

例如(用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将考虑所有上下文。感谢您的反馈。