我一直在环顾四周,试图找出不包括 Java 中函数的默认参数的原因。
我知道可以使用可变参数或通过创建几个接受较少参数的重载函数并调用接受所有参数的真实函数来模拟行为。但是,这些选项都不符合例如 C++ 语法的清晰性和易用性。
有谁知道是否有可靠的技术原因可以制作类似的东西
void myFunc(int a=1, int b=2) {...}
在新版本的 Java 中不受欢迎或不可撤销?
我一直在环顾四周,试图找出不包括 Java 中函数的默认参数的原因。
我知道可以使用可变参数或通过创建几个接受较少参数的重载函数并调用接受所有参数的真实函数来模拟行为。但是,这些选项都不符合例如 C++ 语法的清晰性和易用性。
有谁知道是否有可靠的技术原因可以制作类似的东西
void myFunc(int a=1, int b=2) {...}
在新版本的 Java 中不受欢迎或不可撤销?
它不在 Java 的初始版本中,因为他们认为他们不需要它,可能是为了保持简单。
现在添加它会很棘手,因为它需要以向后兼容的方式完成。在 Java5 中添加可变参数、自动装箱和泛型是一项艰巨的任务,它只能通过有限的功能(例如类型擦除)和增加复杂性(新的方法解析规则使考试技巧问题得到改善)来完成。
最好的方法是在 JVM 上使用非 Java 语言。也许其中一个已经有了这个。
我不知道技术原因,除了它很复杂,哪些值被省略,哪些没有。
例如,在您的示例中,如果只传递了一个整数,那么它应该被默认a
还是b
应该默认?很可能a
,但它确实增加了这种程度的歧义。
一个简单的解决方案是
void myFunc(Integer a, Integer b) {
if (a == null) a = 1;
if (b == null) b = 2;
}
是的,它更冗长,是的,它隐藏了代码中的默认设置,而不是方法签名(然后可以在 JavaDoc 中显示),但它确实强制了一致性。
我同意可选参数将增加巨大的清晰度并节省定义大量重载方法(称为伸缩)的大量工作,这些方法除了相互调用之外什么都不做。然而,这个简洁特性的推动者是通过 name 传递参数。
命名关联是自记录的。相比之下,位置参数关联是简洁的,但它让您始终参考方法的定义,以检查每次调用时哪个参数应位于第n个位置。这很荒谬,并促使我们寻找像Builder 模式这样的解决方案。Builder 实际上同时解决了这两个问题,因为命名关联是可选参数的同义词。但是Builder只对用户有用。API 设计者仍然必须浪费空间/时间来创建 Builder 类。模式偏执者可能不同意,但为每个具有命名/可选参数的方法创建一个 Builder 类是一种矫枉过正的做法。语言设计应该避免这种愚蠢的模式。但是,我不知道它们与变量参数列表的兼容性如何。
避免歧义。Java 支持方法覆盖。
我们假设下面的代码:
public int add(int a) {
// do something
}
public int add(int a, int b = 0) {
// do something
}
当我们调用 时add(12)
,你能告诉我调用了哪个函数吗?