对象状态管理通过封装实现,核心是私有字段强制隔离、公共方法统一管控、static封装类级状态、抽象类/接口解耦复杂流转。

对象状态管理通过封装实现,核心是把状态藏起来、把访问管起来——不让外部直接碰数据,只允许走你定好的接口,而且每个接口都自带校验和约束。
私有字段是第一道硬隔离
把表示状态的字段声明为 private,就从语言机制上切断了外部任意读写的能力。编译器会直接报错,不是靠约定,而是靠强制。
- 比如
private int status;,外部连obj.status = 5;都写不通过 - 没有 getter/setter 的话,连“看一眼”都不行,彻底断掉误用或越权依赖的可能
- 这相当于给状态上了一把物理锁,钥匙只在类自己手里
公共方法是唯一可控入口
所有对状态的读写,必须经过你公开的方法。这些方法不只是转发,而是承担校验、转换、记录、同步等职责。
- 设值前检查合法性:
if (newStatus MAX_STATE) throw new IllegalArgumentException(); - 变更时触发副作用:更新时间戳、通知监听者、写审计日志
- 返回不可变副本:
return Collections.unmodifiableList(internalList);,防止外部偷偷改内部集合
配合 static 封装类级共享状态
当状态属于整个类型而非单个实例(如配置、计数器、连接池),可用 private static + public static 方法统一管控。
- 避免多个实例各自维护一份冗余状态,导致不一致
- 在 setter 中加入线程安全逻辑(如 synchronized 或 Atomic 类)
- 对外只暴露只读视图或带权限校验的修改入口
进阶:用抽象类或接口封装状态流转逻辑
复杂状态变化(如审批流、设备生命周期)适合用状态机模式,把“当前是什么状态”和“能做什么操作”解耦。
- 抽象类定义通用行为契约(如
approve()、reject()) - 每个具体状态子类只实现合法动作,非法调用直接抛异常或静默忽略
- 上下文类只负责委托,不写 if-else 判断,状态转移由子类内部决定










