应避免在构造函数中暴露this引用,因其导致对象半初始化;须禁用this传参、线程启动、监听器注册及非final方法调用;推荐静态工厂、延迟初始化、final字段与安全发布机制。

构造函数中过早使用 this 赋值(尤其是将 this 引用传递给外部对象、启动线程、注册监听器或调用可被重写的方法),会导致对象处于“半初始化”状态,引发空指针、字段默认值误用、逻辑错乱等隐患。核心在于:**此时实例字段尚未完成赋值,但外部代码已能访问该不完整对象**。
避免在构造函数中暴露 this 引用
这是最根本的防范措施。只要 this 没有逃逸出构造过程,外部就无法拿到未初始化完成的对象。
- 禁止将 this 作为参数传给其他方法(尤其静态方法或工厂方法)
- 禁止在构造函数中启动新线程并把 this 传入 Runnable
- 禁止将 this 注册为事件监听器、回调接收者或全局缓存中的键/值
- 避免在构造函数中调用非 private / non-final 的实例方法(子类可能重写,而子类字段还未初始化)
用静态工厂方法替代公有构造函数
将对象创建与初始化逻辑分离,确保返回的是完全构建好的实例。
- 工厂方法内部先 new 出对象,再执行所有必要初始化(包括设置监听、启动资源),最后才返回引用
- 构造函数设为 private,防止绕过工厂直接 new
- 例如:public static Service createWithCallback(Callback cb) { Service s = new Service(); s.init(cb); return s; }
延迟初始化敏感依赖
若某些组件必须持有当前对象引用,应推迟到构造完成之后再建立关联。
- 提供显式的 init() 或 start() 方法,由调用方在确认对象构造完毕后手动触发
- 使用懒加载模式(如双重检查锁单例)包装需延迟绑定的资源
- 对监听器注册等操作,改用弱引用或生命周期感知设计(如 Android 中的 LifecycleObserver)
利用 final 字段 + 安全发布机制
Java 中,正确使用 final 字段配合安全构造,可借助 JVM 内存模型保障发布时的可见性。
- 所有关键状态字段声明为 final,并在构造函数中直接赋值(不可延迟)
- 避免在构造函数中修改非 final 字段后再发布 this
- 确保构造函数不抛异常——否则可能导致部分字段已赋值、部分未赋值,且 this 已逃逸










