You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 21:21:02