Java 当我声明并初始化类的对象时,如何自动递增类中的字段?

Java 当我声明并初始化类的对象时,如何自动递增类中的字段?,java,class,Java,Class,我的Java应用程序中有3个类,其中一个代表医疗政策: public class MedicalPolicy implements PolicyType { private int id; // and some other fields public MedicalPolicy(final LocalDate effective,final LocalDate expiry,final ArrayList<Beneficiary> beneficiarie

我的Java应用程序中有3个类,其中一个代表医疗政策:

public class MedicalPolicy implements PolicyType {
    private int id;
    // and some other fields

    public MedicalPolicy(final LocalDate effective,final LocalDate expiry,final ArrayList<Beneficiary> beneficiaries){
          //Constructor that does NOT set/initialize the id field
    }
}
第三个类包含
main()
方法

每次我在我的
main()
中声明并初始化一个医疗保险单对象时,我希望医疗保险单的
id
增加1,这与汽车保险单相同,即如果我在
main()中声明两个医疗保险单对象
我希望第一份医疗保险的
id
值等于1,第二份医疗保险的
id
值设置为2,如果我申报3份机动车保险,我希望第一份医疗保险的
id
值等于1,第二份医疗保险的
id
值等于2,第三份医疗保险的
id
值等于3

我怎样才能做到这一点


附言:如果我必须从构造函数中设置/初始化它,没有问题,重要的是我不应该将它的值作为构造函数参数传递。

如果你不能创建一个列表,那么该类的每个对象都将与其在索引中的递增位置相关联。例如,listName.get(obj num-1),因为第一个对象将存储在索引0处。此外,listName.size()将返回一个值,以便您可以跟踪您拥有的数量

如果不能创建列表,则该类的每个对象都将与其在索引中的递增位置相关联。例如,listName.get(obj num-1),因为第一个对象将存储在索引0处。此外,listName.size()将返回一个值,以便您可以跟踪您拥有的数量

使用
私有静态int
作为实例变量

在构造函数中,您将id设置为序列号,并向序列号添加一个id

public class MedicalPolicy implements PolicyType {
    private static int serial = 1;
    private int id;
    // and some other fields

    public MedicalPolicy(final LocalDate effective,
                         final LocalDate expiry,
                         final ArrayList<Beneficiary> beneficiaries){
      this.id = serial++;
      // Other constructor stuff
    }
}
公共类医疗政策实现PolicyType{
专用静态int串行=1;
私有int-id;
//以及其他一些领域
公共医疗政策(最终本地生效日期,
最终本地日期到期,
最终ArrayList受益人){
this.id=串行++;
//其他构造函数的东西
}
}

如果类需要线程安全,请使用图灵85中提到的
AtomicInteger

使用
私有静态int
作为实例变量

在构造函数中,您将id设置为序列号,并向序列号添加一个id

public class MedicalPolicy implements PolicyType {
    private static int serial = 1;
    private int id;
    // and some other fields

    public MedicalPolicy(final LocalDate effective,
                         final LocalDate expiry,
                         final ArrayList<Beneficiary> beneficiaries){
      this.id = serial++;
      // Other constructor stuff
    }
}
公共类医疗政策实现PolicyType{
专用静态int串行=1;
私有int-id;
//以及其他一些领域
公共医疗政策(最终本地生效日期,
最终本地日期到期,
最终ArrayList受益人){
this.id=串行++;
//其他构造函数的东西
}
}

如果您的类需要线程安全,请使用图灵85中提到的
AtomicInteger

正如我在评论中所建议的,我将添加一个来计算构造函数调用的数量:

public class MedicalPolicy implements PolicyType {
    private static final AtomicInteger counter = new AtomicInteger();

    private final int id;

    public MedicalPolicy(
            final LocalDate effective,
            final LocalDate expiry,
            final ArrayList<Beneficiary> beneficiaries){
        id = counter.incrementAndGet();
    }
}
公共类医疗政策实现PolicyType{
私有静态最终AtomicInteger计数器=新的AtomicInteger();
私有最终int id;
公共医疗政策(
最终本地日期生效,
最终本地日期到期,
最终ArrayList受益人){
id=计数器。递增和获取();
}
}
使用原子整数的原因是线程安全


但是,请注意,此实现只计算调用构造函数的频率。要获得给定类的可访问实例数,我想到了两种解决方案。一个涉及重写(Java13中不推荐使用)。另一个使用的
列表
跟踪可访问的实例。

正如我在评论中所建议的,我将添加一个来计算构造函数调用的数量:

public class MedicalPolicy implements PolicyType {
    private static final AtomicInteger counter = new AtomicInteger();

    private final int id;

    public MedicalPolicy(
            final LocalDate effective,
            final LocalDate expiry,
            final ArrayList<Beneficiary> beneficiaries){
        id = counter.incrementAndGet();
    }
}
公共类医疗政策实现PolicyType{
私有静态最终AtomicInteger计数器=新的AtomicInteger();
私有最终int id;
公共医疗政策(
最终本地日期生效,
最终本地日期到期,
最终ArrayList受益人){
id=计数器。递增和获取();
}
}
使用原子整数的原因是线程安全

但是,请注意,此实现只计算调用构造函数的频率。要获得给定类的可访问实例数,我想到了两种解决方案。一个涉及重写(Java13中不推荐使用)。另一个使用的
列表
来跟踪可访问的实例。

您可以使用,它在应用程序中使用,例如原子递增计数器

public class MedicalPolicy implements PolicyType {
  private static final AtomicInteger count = new AtomicInteger(); 
    // and some other fields

    public MedicalPolicy(final LocalDate effective,final LocalDate expiry,final ArrayList<Beneficiary> beneficiaries){
          //Constructor that does NOT set/initialize the id field
         count.incrementAndGet(); 
    }
}
公共类医疗政策实现PolicyType{
私有静态最终AtomicInteger计数=新的AtomicInteger();
//以及其他一些领域
公共医疗政策(最终本地日期生效、最终本地日期到期、最终ArrayList受益人){
//未设置/初始化id字段的构造函数
count.incrementAndGet();
}
}
您可以使用,它用于诸如原子递增计数器之类的应用程序中

public class MedicalPolicy implements PolicyType {
  private static final AtomicInteger count = new AtomicInteger(); 
    // and some other fields

    public MedicalPolicy(final LocalDate effective,final LocalDate expiry,final ArrayList<Beneficiary> beneficiaries){
          //Constructor that does NOT set/initialize the id field
         count.incrementAndGet(); 
    }
}
公共类医疗政策实现PolicyType{
私有静态最终AtomicInteger计数=新的AtomicInteger();
//以及其他一些领域
公共医疗政策(最终本地日期生效、最终本地日期到期、最终ArrayList受益人){
//未设置/初始化id字段的构造函数
count.incrementAndGet();
}
}

在两个类中:声明一个
私有静态最终AtomicInteger计数器=新的AtomicInteger()
,调用
counter.getAndIncrement()为什么它是最终的?final不表示不能更改吗?不,
final
表示不能重新分配引用。它的语义在两个类中都不同于C/C++中的
const
:声明一个
私有静态final-AtomicInteger计数器=new-AtomicInteger(),,