Java主构造器内调用方法时如何避免传入this参数
解决方案
方案1:使用无参私有构造器重载
你之前的实现思路可以复用,即便没有业务入参也可以通过增加无实际含义的标记参数实现构造器重载,把初始化逻辑拆分到私有构造器中,公有构造器先创建完整实例再传递该实例代替this,改造后的代码如下:
public class ConsultationDemandeUtilisationPointsViewImpl extends Composite { Driver driver = GWT.create(Driver.class); public ConsultationDemandeUtilisationPointsViewImpl() { // 先完成实例创建 ConsultationDemandeUtilisationPointsViewImpl instance = new ConsultationDemandeUtilisationPointsViewImpl(true); // 用已完成初始化的实例代替this,避免this逃逸 initWidget(uiBinder.createAndBindUi(instance)); driver.initialize(instance); } // 用无业务含义的布尔参数作为构造器重载的区分标记 private ConsultationDemandeUtilisationPointsViewImpl(boolean flag) { initChamps(); initFormulaire(); initFormatage(); } };
方案2:使用静态工厂方法创建实例
你也可以将构造器完全私有化,对外提供静态工厂方法生成实例,从根源上避免构造阶段暴露未初始化完成的this:
public class ConsultationDemandeUtilisationPointsViewImpl extends Composite { Driver driver = GWT.create(Driver.class); // 对外暴露的实例创建入口 public static ConsultationDemandeUtilisationPointsViewImpl create() { ConsultationDemandeUtilisationPointsViewImpl instance = new ConsultationDemandeUtilisationPointsViewImpl(); instance.initWidget(uiBinder.createAndBindUi(instance)); instance.driver.initialize(instance); return instance; } // 私有构造器存放所有前置初始化逻辑 private ConsultationDemandeUtilisationPointsViewImpl() { initChamps(); initFormulaire(); initFormatage(); } };
使用该方案时,外部创建实例的逻辑需要从new ConsultationDemandeUtilisationPointsViewImpl()调整为调用ConsultationDemandeUtilisationPointsViewImpl.create(),如果你的项目依赖注入框架支持静态工厂注入,该方案的代码侵入性更低。
内容的提问来源于stack exchange,提问作者B.Champaux
相关产品推荐
相关产品推荐

