Java 构造函数调用另一个构造函数

Java constructor calling another constructor

我是 Java 的新手,我想在其他构造函数中调用一个构造函数。这是我的代码:

class TestContructor {
    public TestContructor(){
        String params = "1, 2, 3";
        this(params);
    }
    public TestContructor(String params){
        System.out.println("TestContructor with params: " + params);
    }
}

class TestRunner {
    public static void main(String[] args) {
        new TestContructor();
    }
}

然后我得到这个错误:

javac -g Test.java
Test.java:5: error: call to this must be first statement in constructor
        this(params);
            ^
1 error

好的,我更改了 TestConstructor 代码:

class TestContructor {
    public TestContructor(){
        // String params = "1, 2, 3";
        this("1, 2, 3"); //Now is the first statement
    }
    public TestContructor(String params){
        System.out.println("TestContructor with params: " + params);
    }
}

好的,没问题。

那么,java中的规则是调用另一个必须在第一个语句行中声明的构造函数吗?

如果我需要在调用另一个构造函数之前做一些处理怎么办?

我记得我是 java 编程的新手,但我遇到了这个问题,我想知道是否可以做到我想要的。

是的,这是规定。

如果您需要先做其他工作,您唯一真正的选择是将该工作重构为另一种方法。类似于:

public TestConstructor(String params) {
    // whatever
}

public TestConstructor(String... paramParts) {
    this(combineParts(paramParts));
}

private static String combineParts(String[] parts) {
    StringBuilder sb = new StringBuilder();
    for (String part : parts) {
        sb.append(part);
    }
    return sb.toString();
}

如果您有各种相互依赖的计算(例如,您需要调用 this(foo, bar),其中 bar 取决于 foo 的答案和其他一些组件 baz),那么你可以更多地链接构造函数。类似于:

public TestConstructor(FooComponent1 f1, FooComponent2 f2, Baz baz) {
    this(createFoo(f1, f2), baz);
}

private TestConstructor(Foo foo, Baz bar) {
    this(foo, createBar(baz));
}

private TestConstructor(Foo foo, Bar bar) {
    // do whatever
}

请注意,我已将辅助构造函数设为私有。这在 Bar 是私有内部 class 时特别有用,因此外部调用者无法创建并传入它。