如何在Java构造器中使用if else语句解决构造调用需为首行的报错
错误原因
Java语法强制要求:在构造器中调用同类其他构造器(this(...))或父类构造器(super(...))时,必须将该调用放在构造器的第一行。你将this(...)写在if分支内部,不符合该语法规则,所以触发报错。另外你代码中if分支的this后存在笔误,缺少左括号和第一个参数,也需要修正。
解决方法
方案1:使用静态工厂方法(优先推荐)
将构造器设为私有,对外暴露静态方法完成实例化,完全不受构造器调用顺序的限制,逻辑可读性也最高:
// 私有构造器,不对外暴露 private Timbre(String param1, int annee, String pays, int valeur) { // 原有全参数构造器的初始化逻辑 } // 对外的静态工厂方法,替代单参数构造器 public static Timbre newInstance(String string) { if(string.indexOf("-") == -1){ // 对应你if分支的构造器参数,按你实际参数顺序调整即可 return new Timbre(/* 你缺失的第一个参数 */, ANNEE_COURANTE, string, VALEUR_TIMBRE_DEFAUT); } else{ return new Timbre(string, ANNEE_COURANTE, PAYS_DEFAUT, VALEUR_TIMBRE_DEFAUT); } }
调用时直接使用Timbre.newInstance("你的字符串")即可完成实例化。
方案2:用三元表达式把判断逻辑放进this参数
如果一定要保留构造器的写法,可以把分支判断抽成三元表达式,保证this(...)在第一行:
public Timbre(String string){ this( string.indexOf("-") == -1 ? /* 你缺失的第一个参数 */ : string, ANNEE_COURANTE, string.indexOf("-") == -1 ? string : PAYS_DEFAUT, VALEUR_TIMBRE_DEFAUT ); }
该方案仅适合简单判断场景,逻辑复杂时可读性会非常差,且会重复执行indexOf判断,有额外性能开销。
方案3:抽离公共初始化逻辑为私有方法
把所有构造器的公共初始化逻辑抽成私有方法,各个构造器直接调用该方法即可,无需再调用this(...):
// 全参数构造器 public Timbre(String param1, int annee, String pays, int valeur) { init(param1, annee, pays, valeur); } // 单参数构造器 public Timbre(String string){ if(string.indexOf("-") == -1){ init(/* 你缺失的第一个参数 */, ANNEE_COURANTE, string, VALEUR_TIMBRE_DEFAUT); } else{ init(string, ANNEE_COURANTE, PAYS_DEFAUT, VALEUR_TIMBRE_DEFAUT); } } // 公共初始化私有方法 private void init(String param1, int annee, String pays, int valeur) { // 把原来构造器里的所有成员变量赋值逻辑移到这里 }
注意:如果你的类中有final修饰的成员变量,该方案无法使用,因为final变量只能在构造器中直接赋值,不能在普通方法中赋值。
内容的提问来源于stack exchange,提问作者user13911186
相关产品推荐
相关产品推荐

