用class实现状态管理的核心是封装state于实例内部,通过统一方法读写并支持监听;需隐藏原始状态、受控修改、提供subscribe与setState机制,以及派生状态的getter计算。

用 class 实现状态管理,核心是把状态(state)封装在实例内部,通过方法统一读写,并支持监听变化。不依赖框架也能做到响应式更新,关键是控制状态访问入口和触发通知机制。
封装状态与受控修改
避免直接暴露 state 对象,防止外部随意篡改。所有修改必须经过明确的方法,便于追踪、校验或扩展逻辑。
- 用私有字段(如 #state)或闭包隐藏原始状态,只暴露 getter/setter 或操作方法
- 每个修改方法(如 update()、reset())内部调用统一的变更流程,比如先校验再赋值
- 示例中可约定:所有变更都走 setState(next),它合并新值、触发更新,而不是直接 this.#state = {...}
支持订阅与响应更新
让组件或逻辑能“感知”状态变化,需要维护一个回调列表,在状态变更后依次执行。
- 提供 subscribe(fn) 方法,返回取消订阅函数(如 () => unsubscribe)
- 内部用数组存储监听器,setState() 最后遍历执行,并支持传入旧值与新值供监听器对比
- 注意清理:订阅函数应能被移除,避免内存泄漏;例如在组件卸载时调用返回的取消函数
可选:派生状态与只读视图
有些数据是基于当前 state 计算得来的(如 loading 状态、过滤后的列表),适合做成 getter 而非存为字段。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
- 用 get isLoading() 返回 this.#state.pending || this.#state.error === null
- 避免在 setter 中缓存派生值,保持计算逻辑单一、可预测
- 若派生逻辑复杂或频繁访问,可加简单 memoization,但需注意依赖字段变化时清缓存
轻量级实现示意
一个可用的最小闭环:
class Store {
#state = {};
#listeners = [];
constructor(initial = {}) {
this.#state = { ...initial };
}
get state() {
return { ...this.#state };
}
setState(next) {
const prev = { ...this.#state };
this.#state = { ...this.#state, ...next };
this.#listeners.forEach(cb => cb(this.#state, prev));
}
subscribe(cb) {
this.#listeners.push(cb);
return () => {
const i = this.#listeners.indexOf(cb);
if (i > -1) this.#listeners.splice(i, 1);
};
}
}
使用时 new Store({ count: 0 }),调用 setState({ count: 1 }),所有订阅者收到通知——不复杂但容易忽略细节,比如深拷贝、异步安全或批量更新优化。

















