构造函数链中的 Java 方法调用

标签 java constructor-chaining

是否可以使用同一类的另一个构造函数的方法结果调用构造函数?

我希望能够接受多种形式的输入,例如:

public class MyClass
{
    public MyClass(int intInput)
    {
    ...
    }

    public MyClass(String stringInput);
    {
        this(convertToInt(stringInput));
    }

    public int convertToInt(String aString)
    {
        return anInt;
    }
}

当我尝试编译它时,我得到了

error: cannot reference this before supertype constructor has been called

引用convertToInt

最佳答案

您只需要将convertToInt 设置为静态即可。由于它并不真正依赖类实例中的任何内容,因此它可能并不真正属于此类。

这是一个例子:

class MyClass {
    public MyClass(String string) {
        this(ComplicatedTypeConverter.fromString(string));
    }

    public MyClass(ComplicatedType myType) {
        this.myType = myType;
    }
}

class ComplicatedTypeConverter {
    public static ComplicatedType fromString(String string) {
        return something;
    }
}

您必须这样做,因为在幕后, super 构造函数(在本例中为 Object)需要在您自己的构造函数运行之前被调用。通过在对 super(); 的不可见调用之前引用 this(通过方法调用),您违反了语言限制。

参见 the JLS第 8.8.7 节和 more of the JLS第 12.5 节。

关于构造函数链中的 Java 方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9505387/

相关文章:

java - 我应该如何从另一个spring项目中调用打包的spring项目?

java - 当我在一项 Activity 中点击“返回”按钮时,我的应用程序崩溃了

java - 从java调用tesseract函数

java - 如何将上下箭 header value 传递给从 Java 调用的 bash 终端进程

java - 为什么具有不同参数的多个 `this()` 在父构造函数中不起作用?

java - 如何访问复杂的类链中的类字段

Delphi:理解构造函数

java - 当互联网连接丢失时 MySQL 连接会发生什么?

c# - 在 C# 4 中,如何在具有重载构造函数的父类的子类中拥有带可选参数的构造函数?

c# - 具有空主体和类似继承语法的构造函数有什么作用?