我有一个带有可选参数的函数,实现为一对重载方法。此函数调用另一个函数,该函数具有相同的可选参数。问题是低级函数应该使用默认参数,而高级函数不是:
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
}
这很快就会变得很无聊,对我来说似乎并不优雅......
答案 0 :(得分:2)
使用varargs作为可选参数,允许您完全删除重载的实现,同时在调用内部方法时保留原始调用的意图:
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
}
虽然这允许更多而不是一秒参数,但是可以忽略任何额外的内容(如此代码中所示),或者如果长度为>则可以抛出IllegalArgumentException
。 1。
现有的调用代码将与您发布的代码和此代码兼容(无需外部更改)。
请注意,如果调用的varargs没有值,则该方法将其视为空数组(不是null)。