【问题标题】:Java Require "this" in the constructor of the inheriting classJava 在继承类的构造函数中需要“this”
【发布时间】:2022-11-03 21:28:23
【问题描述】:

我有以下类:Command、ParameterData 和 TestCommand。 Command 是一个抽象类,代表一个简单的对象。此类需要 ParameterData 对象的列表。反过来,ParameterData 也需要在其构造函数中使用 Command 类的实例。我想创建一个继承自Command的类,即TestCommand。问题出在:调用构造函数时,出现编译错误:“在调用超类型构造函数之前无法引用‘this’”。我不知道如何解决这个问题。我会很感激你的帮助。

命令类:

public abstract class Command {
    private final String SETTINGS_PATH;

    private final List<ParameterData> PARAMETERS;

    public Command(String settingsPath, List<ParameterData> parameters) {
        this.SETTINGS_PATH = settingsPath;
        this.PARAMETERS = parameters;
    }

    public String getSettingsPath() {
        return SETTINGS_PATH;
    }

    public abstract void run();
}

参数数据类:

public class ParameterData {
    private final String SETTINGS_KEY;

    private final Command COMMAND;

    private final OptionType OPTION_TYPE;

    private final boolean REQUIRED;

    public ParameterData(String settingsKey, Command command, OptionType optionType, boolean required) {
        this.SETTINGS_KEY = settingsKey;
        this.COMMAND = command;
        this.OPTION_TYPE = optionType;
        this.REQUIRED = required;
    }

    public String getSettingsKey() {
        return SETTINGS_KEY;
    }

    public String getSettingsPath() {
        return COMMAND.getSettingsPath() + ".Parameters." + SETTINGS_KEY;
    }

    public OptionType getOptionType() {
        return OPTION_TYPE;
    }

    public boolean isRequired() {
        return REQUIRED;
    }
}

TestCommand 类(“this”发生错误):

public class TestCommand extends Command {
    public TestCommand() {
        super("Settings.TestCommand",
                List.of(new ParameterData("SettingsKey", this, OptionType.STRING, true)));
    }

    @Override
    public void run() {
        //do something
    }
}

【问题讨论】:

  • 从技术上讲,OP 不是将this 传递给超级构造函数,而是传递给ParameterData 的构造函数。如果不在Command 中使PARAMETERS 成为非最终的,然后从子构造函数中设置它,我想不出解决这个问题的方法。

标签: java inheritance constructor


【解决方案1】:

我不知道如何解决这个问题。

它无法修复。当您的 this 引用尚未初始化时,您无法传递 this 的实例。想一想,这是鸡和蛋的问题:this 引用有各种疯狂的事情发生。它将具有尚未初始化的 final 字段,即如果您查询它,其值将发生变化的最终字段。

在构造函数链中,它们是中断。但是当this 还没有“准备好”时,你不能通过将this 发送到其他地方来加剧这个问题。构造函数是对象“诞生”的一部分,this 指的是婴儿。当你的宝宝还没有(完全)出生时,你不能把它交给其他人来哄。

如果你想要 2 个相互引用的对象,都带有 final 字段?不可能。

使一个字段非决赛。使用构建器系统并将此非最终字段包的“设置器”设为私有或完全private,虽然该字段不是最终字段,但您的对象对于所有意图和目的仍然是不可变的 - 无法观察到它的变化一旦它逃脱了它的包裹。

【讨论】:

    猜你喜欢
    • 2013-03-21
    • 2011-09-09
    • 2010-12-11
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    相关资源
    最近更新 更多