this()调用是java中从一个构造方法调用本类另一个构造方法的语法,属于构造器重载的协作机制,必须位于构造方法第一行,不创建新对象,仅委托初始化逻辑。

Java构造方法中用this()调用实现属性依赖注入,本质是利用构造器链完成对象初始化时的参数委派,避免重复赋值或空状态,关键在于调用必须是构造方法的第一条语句,且只能调用本类其他构造器。
什么是this()调用?
this()是Java中从一个构造方法调用本类另一个构造方法的语法,属于构造器重载的协作机制。它不创建新对象,只是把初始化逻辑委托出去,常用于简化多参数构造场景。
- 必须写在构造方法第一行,否则编译报错
- 不能和
super()共存(二者都需首行) - 只能调用本类构造器,不可跨类或调用静态方法
- 适合封装“主构造器”——把最全参数的构造器作为核心,其余构造器通过
this()委派过去
如何用this()实现依赖注入?
所谓“属性依赖注入”,在这里指对象创建时必须持有的、不可为null的关键依赖(如Service、Repository、配置对象等)。用this()可确保所有构造路径最终都经过含完整依赖的构造器,从而统一校验和赋值。
- 定义一个含全部必需依赖的构造器(例如
public UserRepo(UserService service, DatabaseConfig config)) - 其他构造器(如只传
service的)用this(service, new DefaultDatabaseConfig())补全缺失依赖 - 在主构造器内做非空检查:
Objects.requireNonNull(service, "service must not be null") - 这样无论用户调用哪个构造器,都能保证依赖被注入且有效
实战示例:订单服务构造器链
假设OrderService依赖PaymentGateway和NotificationService,但允许部分依赖使用默认实现:
public class OrderService {
private final PaymentGateway gateway;
private final NotificationService notifier;
// 主构造器:强制注入全部依赖
public OrderService(PaymentGateway gateway, NotificationService notifier) {
this.gateway = Objects.requireNonNull(gateway);
this.notifier = Objects.requireNonNull(notifier);
}
// 仅注入网关,通知服务用默认实现
public OrderService(PaymentGateway gateway) {
this(gateway, new EmailNotificationService()); // this()调用主构造器
}
// 无参构造器 → 使用全部默认依赖
public OrderService() {
this(new StripeGateway(), new SmsNotificationService()); // this()链式调用
}
}
这样既保持API友好,又杜绝了null依赖隐患,比在每个构造器里重复判空更简洁可靠。
注意事项与常见陷阱
this()看似简单,但误用会导致编译失败或逻辑混乱:
- 循环调用会编译报错(如A调B,B又调A)
- 若依赖对象需动态计算(如从Spring容器取Bean),
this()无法支持——此时应改用工厂模式或依赖注入框架 - 过度嵌套构造器链会降低可读性,建议最多2~3层,主构造器保持清晰职责
- 字段初始化语句(如
private List<string> items = new ArrayList();</string>)在this()调用前已执行,但此时对象尚未完全构建,慎用于复杂逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











