weakmap 可用于单例模式的私有状态控制,其键必须为对象且不阻止垃圾回收,以实例为键、私有数据为值实现隔离;需配合闭包隐藏 weakmap 引用,并额外通过静态属性或 getinstance 方法保障单例。

WeakMap 可以用来实现单例模式中的私有状态控制,核心在于利用它的键必须是对象、且不阻止垃圾回收的特性,把实例作为键,把私有数据作为值存进去——这样既避免了属性名冲突,又保证了外部无法直接访问或篡改。
用 WeakMap 存储每个实例的私有数据
WeakMap 的键只能是对象(如 this),值可以是任意类型。把 this 当作键,就能为每个实例单独绑定一份私有状态,而且这个映射不会阻止实例被回收。
- 不需要在构造函数里给实例加属性,避免污染 public API
- WeakMap 实例通常定义在模块作用域或类外部,确保所有实例共享同一个映射表
- 每次访问私有状态时,用当前 this 去 WeakMap 中 get/set,天然隔离
配合闭包封装私有方法和数据访问逻辑
WeakMap 本身不提供封装能力,需要结合闭包隐藏 WeakMap 引用和操作逻辑,只暴露必要的公有接口。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 把 WeakMap 声明在立即执行函数或模块顶层,外部代码拿不到引用
- 通过闭包内的函数(如 getPrivate / setPrivate)统一管理读写,可加入校验或转换逻辑
- 类的方法内部调用这些闭包函数,使用者完全感知不到 WeakMap 的存在
单例保障需额外处理,WeakMap 不负责这个
WeakMap 只管“私有状态隔离”,不保证全局只有一个实例。要实现真正单例,得配合静态属性或模块级变量做实例缓存。
- 在类上加一个静态 instance 属性,首次 new 时赋值,后续直接返回它
- 或者把构造函数设为私有,只暴露一个 getInstance() 方法
- WeakMap 照样用于该唯一实例的私有状态管理,不影响单例逻辑
注意 WeakMap 的局限性
它不是万能的私有方案,有些边界情况要心里有数:
- 无法遍历、不能知道存了多少条记录,调试时看不到所有私有状态
- 如果传入的 key 被意外丢弃(比如 this 被覆盖),就再也取不到对应私有数据
- 不适用于需要序列化或跨上下文共享私有状态的场景
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










