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
相关产品推荐
相关产品推荐

