在不支持语言的语言中添加可选参数时,最佳设计是什么?

时间:2013-09-28 00:02:48

标签: java overloading optional-parameters maintainability

说我有

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是最方便的,但我认为如果每次我想添加一个可选参数时都放入一个新的重载方法可能会更难维护。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

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

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

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

我的答案是“这取决于你拥有多少参数”。如果您的情况属于一个或两个额外的参数,正如我认为的那样,那么选项A将是我的选择。如果您是一个罕见的情况,有很多其他参数,那么选择选项B.