链接重载方法

时间:2015-04-29 23:31:25

标签: 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) {
    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
}

这很快就会变得很无聊,对我来说似乎并不优雅......

1 个答案:

答案 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)。