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

Java有状态类重构咨询:避免容器消费时的状态突变

重构有状态Container类以避免状态突变

要避免状态突变,核心思路是将Container改造为不可变类——每次"消费"操作不修改原有实例,而是返回一个承载新状态的新实例。以下是具体重构方案:

  • 标记成员变量为final,确保实例创建后内部状态无法被修改
  • 移除原有的consumeContainer方法,替换为返回新实例的方法(比如命名为consume)
  • 添加参数校验,避免生成无效状态的实例
  • 提供全参构造方法,保证所有final变量被初始化

重构后的代码示例:

class Container {
    private final int capacity;
    private final String name;

    // 全参构造方法,初始化所有不可变成员
    public Container(int capacity, String name) {
        if (capacity < 0) {
            throw new IllegalArgumentException("Capacity cannot be negative");
        }
        this.capacity = capacity;
        this.name = name;
    }

    public int getCapacity() {
        return capacity;
    }

    public String getName() {
        return name;
    }

    // 消费操作返回新实例,不修改当前对象状态
    public Container consume(int numberOfUnits) {
        if (numberOfUnits < 0) {
            throw new IllegalArgumentException("Number of units cannot be negative");
        }
        if (numberOfUnits > this.capacity) {
            throw new IllegalArgumentException("Cannot consume more than available capacity");
        }
        return new Container(this.capacity - numberOfUnits, this.name);
    }
}

使用方式

调用消费方法时,接收返回的新实例即可,原实例状态保持不变:

Container original = new Container(10, "StorageBox");
Container afterConsume = original.consume(4);
// original的capacity仍为10,afterConsume的capacity为6

方案优势

  • 线程安全:不可变类天生线程安全,无需额外同步逻辑
  • 状态可追溯:每个实例对应唯一确定的状态,便于调试和记录状态变化
  • 无副作用:操作不会影响原有实例,避免意外的状态变更

内容的提问来源于stack exchange,提问作者user4202236

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:51:34