Java中没有默认参数的技术原因

时间:2010-11-26 09:29:13

标签: java default-parameters

我一直在环顾四周试图找出不包含Java中函数的默认参数的原因。

我知道可以使用varargs模拟行为,或者通过创建几个接受较少参数的重载函数来模拟行为,并调用接受所有参数的实际函数。但是,这些选项都不符合例如清晰度和易用性。 C ++的语法。

有没有人知道是否有一个可靠的技术原因会产生类似

的东西
void myFunc(int a=1, int b=2) {...}
在新版本的Java中

不受欢迎或无法撤销?

4 个答案:

答案 0 :(得分:5)

我不知道技术上的原因,除了复杂哪些值被忽略而哪些不被忽略。

例如,在您的示例中,如果只传递了一个整数,那么应该默认为a还是b?最有可能是a但它确实增加了这种模糊性。

一个简单的解决方案是

void myFunc(Integer a, Integer b) {
  if (a == null) a = 1;
  if (b == null) b = 2;

}

是的,它更长时间,是的,它隐藏了代码中的默认值,而不是方法签名(可以在JavaDoc中显示),但它确实强制执行一致性。

答案 1 :(得分:4)

避免歧义。 Java支持方法覆盖。

我们假设以下代码:

<br/>

当我们调用public int add(int a) { // do something } public int add(int a, int b = 0) { // do something } 时,你能告诉我调用了哪个函数吗?

答案 2 :(得分:3)

它不是Java的初始版本,因为他们认为他们不需要它,可能是为了简单。

现在添加它会很棘手,因为它需要以向后兼容的方式完成。在Java5中添加varargs,autoboxing和泛型是一项重大任务,它只能通过有限的功能(例如类型擦除)来完成,并且代价是增加复杂性(新的方法解析规则可以提供良好的考试技巧问题)。 / p>

最好的方法是在JVM上使用非Java语言。也许他们中的一个已经有了这个。

答案 3 :(得分:1)

我同意可选参数会增加很大的清晰度并节省定义重载方法(称为telescoping)的大量工作,这些方法除了相互调用之外什么都不做。但是,这个简洁功能的启用程序是passing arguments by name

命名关联是自我记录的。相比之下,位置参数关联是简洁的,但它使您始终可以引用方法的定义来检查在每次调用时 n 位置中预期的参数。这是荒谬的,并激励我们寻找像Builder pattern这样的解决方案。 Builder实际上同时解决了这两个问题,因为命名关联是可选参数的同义词。但Builder只对用户有用。 API设计者仍然必须浪费空间/时间来创建Builder类。模式偏执者可能不同意,但为每个具有命名/可选参数的方法创建一个Builder类是一种过度的做法。语言设计应该避免这种愚蠢的模式。但是,我不知道它们与变量参数列表的兼容性。