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

Kri*_*ket 18 java default-parameters

我一直在四处寻找,试图找出不包括Java中函数的默认参数的原因.

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

有谁知道是否有一个可靠的技术原因会产生类似的东西

void myFunc(int a=1, int b=2) {...}
Run Code Online (Sandbox Code Playgroud)

在新版Java中不受欢迎或无法撤销?

Thi*_*ilo 5

它不在 Java 的初始版本中,因为他们决定不需要它,可能是为了让事情变得简单。

现在添加它会很棘手,因为它需要以向后兼容的方式完成。在 Java5 中添加可变参数、自动装箱和泛型是一项重大任务,而且只能通过有限的功能(例如类型擦除)来完成,并且以增加复杂性为代价(新的方法解析规则适合考试技巧问题)。

最好的选择是在 JVM 上使用非 Java 语言。也许其中之一已经有了这个。

  • Groovy 有默认参数值:http://groovy.codehaus.org/Extended+Guide+to+Method+Signatures#ExtendedGuidetoMethodSignatures-ArgumentswithDefaultValues (2认同)

小智 3

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

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

一个简单的解决方案是

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

}
Run Code Online (Sandbox Code Playgroud)

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

  • 我不同意.在C++中没有歧义 - 虽然它的代价是你可以指定哪些参数(即你不能让第一个是默认值并为第二个赋值).但是,当您使用像Eclipse这样的IDE时,这将是一个小问题,它将告诉您该方法的签名是什么.FlexBuilder做得很好...... (16认同)