如何为实体返回singleton单例对象 选用哪种实现方式更为合适
单例对象返回实现选型指南
针对单元素集合场景的选型
我们日常需要返回仅包含单个实体的单例集合时,根据你使用的JDK版本选择对应实现即可:
Java 8 及更低版本
优先选择java.util.Collections下的单例集合相关API:
- 单例List用
Collections.singletonList(你的实体对象) - 单例Set用
Collections.singleton(你的实体对象) - 单例Map用
Collections.singletonMap(键, 你的实体对象)
这组API的优势: - 专门为单个元素场景做了内存优化,比自行new ArrayList后添加单个元素的内存占用小很多
- 天生不可变,调用增删方法直接抛出异常,避免后续代码意外修改集合内容
- 线程安全,无可变成员,多线程场景可以直接共享使用
注意:如果你后续需要修改返回的集合,不要用这组API,手动new对应集合类添加元素即可。
Java 9 及更高版本
优先选择JDK 9新增的不可变集合工厂方法:
- 单例List用
List.of(你的实体对象) - 单例Set用
Set.of(你的实体对象) - 单例Map用
Map.of(键, 你的实体对象)
这是官方推荐的Collections.singleton*的替代实现,除了具备上面提到的所有优势之外,还有两个额外好处: - 入参校验更严格,明确禁止传入null值,能提前暴露空值问题
- API设计更统一,不管是1个还是多个元素都可以用同一组API,代码风格一致性更高
跨版本兼容场景选型
如果你的代码需要同时在Java 8和Java 9+环境运行,统一用Collections.singleton*系列即可,全JDK版本都原生支持,不需要引入额外依赖。
非集合类型的实体单例选型
如果你要返回的是单个实体对象本身的单例(不是装载实体的单例集合),优先用枚举类实现单例模式,可以天然避免序列化、反射攻击破坏单例的问题。
内容的提问来源于stack exchange,提问作者Rpj
相关产品推荐
相关产品推荐

