一尘不染

重载的构造函数调用其他构造函数,但不作为第一条语句

java

我在Java中使用多个构造函数时遇到麻烦。

我想做的是这样的:

public class MyClass {

 // first constructor
 public MyClass(arg1, arg2, arg3) {
  // do some construction
 }

 // second constructor
 public MyClass(arg1) {
      // do some stuff to calculate arg2 and arg3
      this(arg1, arg2, arg3);
    }
}

但是我不能,因为第二个构造函数不能调用另一个构造函数,除非它是第一行。

这种情况的常见解决方案是什么?我无法“在线”计算arg2和arg3。我以为也许可以创建一个构造助手方法来完成实际的构造,但是我不确定这是否“漂亮”……

编辑 :由于我的某些字段是最终的,因此使用辅助方法也是有问题的,我无法使用辅助方法进行设置。


阅读 226

收藏
2020-12-03

共1个答案

一尘不染

通常,请使用另一种常见方法-如您所建议的“构造助手”。

public class MyClass {

    // first constructor 
    public MyClass(arg1, arg2, arg3) { 
      init(arg1, arg2, arg3); 
    }

    // second constructor 
    public MyClass(int arg1) { 
      // do some stuff to calculate arg2 and arg3 
      init(arg1, arg2, arg3); 
    }

    private init(int arg1, int arg2, int arg3) {
      // do some construction 
    }
}

另一种选择是一种工厂风格的方法,其中您有一个MyClassFactory为您提供MyClass实例的实例,并且MyClass只有一个构造函数:

public class MyClass {

    // constructor 
    public MyClass(arg1, arg2, arg3) { 
      // do some construction 
    } 
}

public class MyClassFactory {

    public static MyClass MakeMyClass(arg1, arg2, arg3) { 
      return new MyClass(arg1, arg2, arg3);
    }

    public static MyClass MakeMyClass(arg1) { 
      // do some stuff to calculate arg2 and arg3 
      return new MyClass(arg1, arg2, arg3);
    } 
}

我绝对更喜欢第一种选择。

2020-12-03