Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 链接重载方法_Java - Fatal编程技术网

Java 链接重载方法

Java 链接重载方法,java,Java,我有一个带有可选参数的函数,作为一对重载方法实现。此函数调用另一个具有相同可选参数的函数。问题在于,较低级别的函数应该使用默认参数,而较高级别的函数则不是: public void doTask(String arg1, String arg2) { // do a bunch of things smallstep(arg1, arg2); // do another bunch of things } public void doTask(String arg1)

我有一个带有可选参数的函数,作为一对重载方法实现。此函数调用另一个具有相同可选参数的函数。问题在于,较低级别的函数应该使用默认参数,而较高级别的函数则不是:

public void doTask(String arg1, String arg2) {
    // do a bunch of things
    smallstep(arg1, arg2);
    // do another bunch of things
}

public void doTask(String arg1) {
    doTask(arg1, null);
}

public void smallstep(String arg1, String arg2) {
    // do stuff
}

public void smallstep(String arg1) {
    smallstep(arg1, 1);
}
因此,基本上问题在于,如果未提供第二个参数,则
doTask
函数应将
1
作为参数传递(或仅使用一个参数调用
smallstep
),但传递null将调用具有两个参数的参数

在我的具体例子中,类型更复杂,方法在不同的类中,因此
smallstep
的默认参数对包含
doTask
的类不可见,因此无论如何也不应该是。除了检查
arg2==null
并调用相应的函数之外,还有什么方法可以处理这个问题吗

public void doTask(String arg1, String arg2) {
    // do a bunch of things
    if (arg2 == null) {
        smallstep(arg1);
    } else {
        smallstep(arg1, arg2);
    }
    // do another bunch of things
}
这会很快变得阻塞,对我来说似乎不是很优雅…

使用a作为可选参数,允许您完全删除重载实现,同时在调用内部方法时保留原始调用的意图:

public void doTask(String arg1, String... arg2) {
    // do a bunch of things
    smallstep(arg1, arg2);
    // do another bunch of things
}

public void smallstep(String arg1, String... arg2) {
    String arg = arg2.length == 0 ? "some default" : arg2[0];
    // do stuff
}
尽管这允许一个以上的秒参数,但是任何额外的参数都可以被忽略(如在本代码中),或者如果长度>1,您可以抛出一个
IllegalArgumentException

现有呼叫代码将与您发布的代码和此代码兼容(无需外部更改)


请注意,如果在没有值的情况下调用varargs,则该方法会将其视为空数组(而不是null)。

这确实更加优雅。