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

2022-09-02 02:42:56

我在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。我想也许创建一个构造助手方法,这将完成实际的构造,但我不确定这是否如此“漂亮”......

编辑:使用帮助器方法也是有问题的,因为我的一些字段是最终的,我无法使用帮助器方法设置它们。


答案 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 
    }
} 

另一种方法是工厂样式的方法,其中您有一个为您提供实例的方法,并且只有一个构造函数:MyClassFactoryMyClassMyClass

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);
    } 
} 

我绝对更喜欢第一个选项。


答案 2

下一个可能的解决方案是工厂方法。这些静态方法可以重载,计算后它们可以调用私有/受保护的构造函数

public class MyClass {

    private MyClass( arg1, arg2, arg3 ) {
         // do sth
    }

    public static MyClass getInstance( arg1 ) {
         // calculate arg2,3
        return new MyClass( arg1, arg2, arg3 );
    }

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

编辑:当您有最终字段时,此方法也是理想的选择