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

2022-09-02 04:48:17

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

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

有谁知道是否有坚实的技术原因可以使这样的事情

void myFunc(int a=1, int b=2) {...}

在新版本的Java中是不可取的还是不可撤消的?


答案 1

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

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

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


答案 2

我不知道技术原因,除了哪些值被省略,哪些值不被省略很复杂。

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

一个简单的解决方案是

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

}

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


推荐