1

说我有

void foo(int a);

我想使用不支持它的语言(即Java)添加一个可选参数:

void foo(int a, int optionalParam);

假设我将默认设置为 0。

现在在我的代码库中,我有很多调用foo(int a)

是不是更好

A)修改foo(int a) { foo(a, 0); }所以我不必在任何地方改变调用foo(int a)类似的东西foo(a, 0);

或者

B)删除foo (int a)并替换所有调用foo(int a)类似的东西foo(a, 0)

A 是最方便的,但我想如果每次想添加可选参数时都放入一个新的重载方法,可能会更难维护。

4

2 回答 2

2

严格来说,B不是模拟可选参数选项,因为它相当于“忘记使用默认参数,总是传递所有参数”。A另一方面,该选项允许您“廉价地”模拟可选参数:通过添加显式传递可选参数的重载,您可以获得所需的功能。

关于选项的丑陋部分A是所需重载的数量等于可选参数的数量,因此如果您有三个或四个可选参数,则需要两个或三个重载。

当然,另一个不是真正等效的选项是使用具有可变数量参数的函数。这种方法的问题在于,一旦您的可选参数的类型开始出现分歧,您就需要放弃编译时类型安全,这是相当不可取的。

于 2013-09-28T00:09:49.290 回答
1

大多数带有可选参数的情况只涉及一两个。

对于一个额外的参数(甚至两个),可以添加一个重载方法,如您的选项“A”。已经调用旧方法的代码不需要更改,新代码可以调用其中任何一个。

但是,对于超过 2 个,它变得很麻烦,尤其是对于独立的可选变量。这需要指数级的重载:1 个可选变量总共 2 个,2 个可选变量总共 4 个,3 个可选变量总共 8 个,等等。

此时,最好使用包含所有“可选”参数的方法,只要您的方法能够区分“未”传递的值,例如标记值或null.

我的回答是“这取决于”你有多少参数。如果您的情况属于一两个额外参数,就像我认为最常见的那样,那么选项 A 将是我的选择。如果您是具有大量附加参数的罕见情况,请选择选项 B。

于 2013-09-28T00:09:34.130 回答