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)。这确实更加优雅。