Java重载构造器复用:非必填参数默认值调用无冗余实现咨询
解决方案
Java 中要在同类构造器内调用其他重载构造器,需使用this(参数列表)语法,且该调用必须放在构造器的第一行,修改后的代码如下:
public MyObject(int field1) { this(field1, 0); }
原写法错误原因
你之前使用的new MyObject(field1, 0)会创建一个独立的全新实例,和当前正在初始化的实例没有关联,既无法完成当前实例的初始化,还会产生多余的对象开销,不符合你的需求。
扩展说明
this()构造器调用必须放在构造器方法的第一行,前面不能添加任何其他业务代码。- 如果需要在传入默认值前做参数预处理,可以将全参构造器中的公共逻辑抽离为私有初始化方法,两个构造器分别调用该方法即可,示例如下:
public MyObject(int field1, int field2) { init(field1, field2); } public MyObject(int field1) { // 此处可添加自定义参数处理逻辑 int defaultField2 = 0; init(field1, defaultField2); } // 公共初始化逻辑全部放在该私有方法中 private void init(int field1, int field2) { this.field1 = field1; this.field2 = field2; // 原全参构造器中的其他复杂业务逻辑 }
- 如果非必填参数数量较多,也可以采用建造者模式来替代多构造器重载,避免构造器数量过多导致的维护成本上升。
内容的提问来源于stack exchange,提问作者TheEmeritus
相关产品推荐
相关产品推荐

