【问题标题】:how to increment final attribute variable in constructor?如何在构造函数中增加最终属性变量?
【发布时间】:2022-12-15 12:21:27
【问题描述】:

在我的作业中,我有一个带有属性的 Java 类

private final int idOfPassenger;
private final String name;

在仅采用 String 作为参数的构造函数中,我应该初始化乘客的姓名和 ID。但是每次我创建一个new Passenger 时,我应该将idOfPassenger 变量递增 1(从 0 开始),因此没有乘客具有相同的编号。

我不允许更改 private final 或构造函数参数。 我如何在每次创建新乘客时将 idOfPassengers 递增 1?

public class Passenger {

    private final int idOfPassenger;
    private final String name;

    public Passenger(String name) {
        this.name = name;
        this.idOfPassenger = 0;
    }
}

【问题讨论】:

  • 您可能打算使用另一个变量来跟踪要使用的下一个 ID,这将不是最终的,而是静态的。 private static int nextPassengerId = 0;。然后你会执行idOfPassenger = nextPassengerId;并将其递增一个,nextPassengerId++;。注意多线程问题,如果这是一个问题,请使用 AtomicInteger 代替 nextPassengerId

标签: java increment final


【解决方案1】:

final 字段的要点是它不能重新分配给新值。所以你不能增加它。但是你误解了任务。您不应该增加现有对象的private final int idOfPassenger;,而是在创建新对象时始终使用比上次创建的对象高一个值来初始化它。您可以通过引入属于该类而不是任何特定对象的静态字段来实现该行为:

public class Passenger {

    private final int idOfPassenger;
    private final String name;
    private static int currentId = 0;

    public Passenger(String name) {
        currentId++;
        this.name = name;
        this.idOfPassenger = currentId;
    }
}

这将创建一个属于类和所有对象共享的静态字段。它用 0 初始化,然后每次创建新对象时,该静态字段都会递增,并将 final int idOfPassenger 值设置为该静态字段的当前值。

【讨论】:

  • 谢谢!在您编写的代码中,第一位乘客的 ID 是 0 还是 ID 1?
猜你喜欢
  • 2017-08-09
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多