我有一个接受参数的构造函数,这个参数可能无效;如果它无效,我希望它运行构造函数的无参数构造函数.否则,它应该继续执行给定的输入,并对该输入执行多项操作.

不幸的是,Java出于某种原因强制构造函数调用在第一个语句中.除了复制代码之外,还有什么方法可以解决这个问题吗?(我内心的程序员不喜欢这样!)

理想情况下,我的代码应该是这样工作的:

public Constructor() {
    super();
    // some constructor code
}

public Constructor(Object arg) {
    if (arg == null) {
        this(); // calls the first constructor instead of proceeding
        return;
    }

    super();
    /** 
     * some code to handle the new input,
     * if it isn't null
    **/
}

然而,这在Java中显然是不可能的,因为任何构造函数语句都需要在第一个语句中.有没有一种优雅/正确的方法来处理这件事?除了构造函数链接之外,我在网上找不到任何东西,这是另一回事.

推荐答案

将要在无参数构造函数中运行的代码移到单参数构造函数中:

public YourClass(Object arg) {
    super();
    if (arg == null) {

        // move the code in the parameterless constructor here...

        return;
    }

    /** 
     * some code to handle the new input,
     * if it isn't null
    **/
}

现在,无参数构造函数不需要再次复制该代码-它只需使用null调用单参数构造函数:

public YourClass() {
    this(null);
}

或者,如果向单参数构造函数传递"无效"实参并非易事(例如,如果null是一个有效值,并且通过判断对象本身来识别无效值),则可以在私有构造函数中使用boolean实参编写所有内容,并使用该实参进行分支.

这个 idea 基本上是有one个构造函数,其他所有构造函数都委托给它,类似于Kotlin中的类必须有一个主构造函数.

// you should be able to name the parameters with better names :)
private YourClass(Object arg, boolean parameterlessImplementation) {
    if (parameterlessImplementation || !isValid(arg)) {
        // move the code in the parameterless constructor here...
    } else {
        // do things with arg
    }
}

public YourClass(Object arg) {
    this(arg, false);
}

public YourClass() {
    this(null, true);
}

Java相关问答推荐

RDX触发ChoiceBox转换器(并按字符串值排序)

OpenJDK、4K显示和文本质量

无法找到符号错误—Java—封装

CompleteableFuture是否运行在不同的内核上?

使用GridBagLayout正确渲染

如何从错误通道回复网关,使其不会挂起

如何修复PDF重建过程中的文本定位

我正在try 跟踪数组中最大的两个数字

为什么Spring Boot项目无法为基于MySQL的CRUD应用程序找到从JPARepository接口扩展的ProductRepository?

Java连接池无法正常工作

无法播放音频:从资源加载库GStreamer-Lite失败

如何在ImageIO或十二只猴子中旋转TIFF CMYK图像?

使用for循环时出现堆栈溢出错误,但如果使用if块执行相同的操作,则不会产生错误

如何在Java中的重写方法参数中强制(Enum)接口实现?

为什么使用lo索引来解决二进制搜索问题不同于使用hi索引?

如何利用OpenTelemeter将初始值(零)输出到普罗米修斯

谷歌应用引擎本地服务器赢得';t在eclipse上运行

Java编译器是否进行了持续的折叠优化,以及如何进行判断?

放置在变量中的Java成员引用不相等

窗口启动后不久,从java.awt.Graphics disapear创建的矩形