Java中如何在构造方法中递增final类型的乘客ID属性?
问题描述
我有一个Java类,包含以下属性:
private final int idOfPassenger; private final String name;
该类的构造方法仅接收String类型参数,需要同时初始化乘客的name和idOfPassenger属性。要求每次创建new Passenger实例时,idOfPassenger从0开始每次自增1,保证所有乘客ID不重复。且不允许修改private final修饰符或构造方法参数。请问如何实现每次创建乘客时idOfPassenger自增1?
对应的原始代码如下:
public class Passenger { private final int idOfPassenger; private final String name; public Passenger(String name) { this.name = name; this.idOfPassenger = 0; } }
解决方案
可以通过类的静态变量维护全局自增的ID,静态变量属于类本身而非单个实例,所有实例共享该变量,以此保证ID的唯一性和自增逻辑。
基础实现(单线程环境)
修改后的代码如下:
public class Passenger { // 静态变量,维护下一个要分配的ID,初始值为0 private static int nextId = 0; private final int idOfPassenger; private final String name; public Passenger(String name) { this.name = name; // 先将当前nextId赋值给实例ID,再自增nextId this.idOfPassenger = nextId++; } }
线程安全实现(多线程环境)
如果需要在多线程场景下创建实例,直接使用nextId++会存在线程安全问题(++操作非原子性),此时可以使用AtomicInteger保证原子操作:
import java.util.concurrent.atomic.AtomicInteger; public class Passenger { // 原子类静态变量,保证多线程下ID分配的原子性 private static final AtomicInteger nextId = new AtomicInteger(0); private final int idOfPassenger; private final String name; public Passenger(String name) { this.name = name; // getAndIncrement()方法原子性地获取当前值并自增 this.idOfPassenger = nextId.getAndIncrement(); } }
原理说明
- 静态变量
nextId属于Passenger类,所有Passenger对象共享这个变量,能实现全局ID的连续自增。 - 构造方法中先将
nextId的当前值赋值给final修饰的idOfPassenger(满足final变量必须在构造方法中初始化的要求),再更新nextId的值,确保每个实例拿到唯一的ID。 - 线程安全版本中,
AtomicInteger的getAndIncrement()方法是原子操作,避免了多线程下多个实例同时修改nextId导致的ID重复或混乱问题。
内容的提问来源于stack exchange,提问作者user19293033
相关产品推荐
相关产品推荐

