防止this引用逃逸的核心是对象未构造完成前绝不暴露给外部:禁止构造器中传递this、启动线程、注册监听、使用非静态内部类;初始化逻辑移至init()/start()等显式方法;采用私有构造器+工厂方法确保原子发布;构造器内只调用private/final方法。

防止继承体系下构造方法中 this 引用逃逸,核心是守住“对象未构造完成前,绝不让外部看到它”这条线。这不是靠运气或注释提醒,而是通过语言机制和设计约束强制保障。
禁止在构造器中暴露 this
这是最直接、最不可妥协的规则。只要 this 被传给外部方法、注册进监听器、存入静态容器、启动线程,或被匿名内部类隐式持有,就等于把半成品交出去——此时子类字段还是默认值(null、0、false),JVM 也不保证其他线程能看到 final 字段的正确值。
- 父类构造器里别调用
register(this)、eventBus.post(this)、cache.put("key", this) - 别在构造器里写
new Thread(() -> doSomething()).start()—— Lambda 隐式捕获this - 避免创建非静态内部类(包括匿名类),它们自动持有
this$0引用
把初始化逻辑后移到显式方法中
构造器只做三件事:分配内存、设默认值、校验参数。所有依赖子类状态的操作,必须推迟到对象完全构造完毕之后。
- 提供
init()、start()或open()等 public/protected 方法,由调用方在new后主动触发 - 这些方法可声明为
abstract,强制子类实现,确保字段已赋值、方法已就绪 - 资源启动、监听注册、回调绑定等,全部挪到这类方法里执行
用工厂方法 + 私有构造器控制发布时机
彻底封死绕过安全流程的可能。把构造和初始化打包成原子操作,对外只暴露工厂入口。
- 将构造器设为
private,防止用户直接new - 提供静态工厂方法,如
public static Service create(Callback cb) - 工厂内部先
new Service(),再调用s.init(cb),最后返回引用 - 这样能确保对象在返回前已完成全部初始化,且
this从未逃逸
对虚方法调用加 final 或 private 保护
父类构造器里调用子类可重写的方法,是未初始化隐患的高发区。Java 允许语法上这么做,但语义上极危险。
- 构造器中只调用
private或final方法,子类无法覆盖,字段访问绝对安全 - 把原本放在构造器里的多态逻辑,移到
init()中,此时子类字段已就位 - 避免在抽象类构造器中解析配置、初始化连接池等依赖子类行为的操作
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











