不可变设计模式是构建天然线程安全对象最直接可靠的方式,要求字段全为private final且类型不可变,类声明为final,构造器内完成校验与防御性拷贝,通过返回新实例实现状态变更。

在多线程并发编程中,不可变设计模式是构建天然线程安全领域对象最直接、最可靠的方式——它不依赖锁、不引入同步开销,靠的是“构造即定型”的约束力。
确保字段全为 final 且类型本身不可变
所有状态字段必须声明为 private final,且其类型需天然不可变或经封装后不可变:
- 优先使用 JDK 内置不可变类型:String、Integer、LocalDateTime、BigDecimal 等
- 集合类不能直接用 ArrayList 或 HashMap,应使用:
• Collections.unmodifiableList(list)(运行时防护)
• ImmutableList.of("a", "b")(Guava,编译期+运行期双重保障)
• List.copyOf(list)(Java 10+,轻量高效) - 避免踩坑:final List
items; 并不等于“items 内容不可变”,只是引用不可再赋值
类本身必须声明为 final,禁止继承破坏
子类可通过重写方法或新增可变字段绕过不可变约束。因此:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 类定义必须加 final 关键字,如
public final class OrderSnapshot - 若需灵活构造,可用私有构造 + 静态工厂方法(如
of(...)),但类仍不可继承 - 不要在构造器中调用任何可能被子类重写的方法(防止 this 逸出与状态未完成暴露)
杜绝 this 引用逸出,构造过程必须原子完整
对象一旦发布,就必须处于完全有效、不可更改的状态:
- 禁止在构造函数中启动新线程、注册监听器、放入静态容器或传递 this 给外部方法
- 对传入的可变参数做防御性拷贝:例如接收 Date 或 MutableCollection 时,立即 clone() 或 copyOf()
- 所有校验逻辑(如非空、范围检查)必须在构造器内完成,不允许存在“半初始化”中间态
提供无副作用的“变更”能力:用新实例替代修改
领域对象常需表达状态演进(如订单从“待支付”变为“已发货”),不可变模型通过返回新对象实现:
- 不提供 setter,而是提供语义化 builder 方法或转换方法:
OrderSnapshot withStatus(OrderStatus newStatus)
return new OrderSnapshot(this.id, newStatus, this.items); - 配合 record(Java 14+)可大幅简化:record 自动 final 字段、不可变、自动实现 equals/hashCode/toString
- 注意:频繁全量重建可能带来 GC 压力,适用于读远多于写、每次变更影响范围明确的领域场景(如配置快照、事件溯源中的事件对象、API 响应 DTO)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










