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

Java中没有默认参数的技术原因,java,default-parameters,Java,Default Parameters,我一直在四处寻找,试图找出不包括Java函数的默认参数背后的原因 我知道,可以使用varargs或通过创建几个接受较少参数的重载函数来模拟行为,并调用接受所有参数的实际函数。但是,这两个选项都不符合C++语法的清晰性和易用性 有人知道有没有可靠的技术原因会让事情变得像这样吗 void myFunc(int a=1, int b=2) {...} 在新版本的Java中不需要或可撤消?我不知道有什么技术原因,除了哪些值被省略,哪些值没有被省略之外 例如,在您的示例中,如果只传递了一个整数,那么应该

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

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

有人知道有没有可靠的技术原因会让事情变得像这样吗

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

在新版本的Java中不需要或可撤消?

我不知道有什么技术原因,除了哪些值被省略,哪些值没有被省略之外

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

一个简单的解决办法是

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

}

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

它不在Java的初始版本中,因为他们决定不需要它,可能是为了保持简单

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


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

我同意,可选参数可以极大地提高清晰度,并节省定义重载方法(调用)负载的大量工作,这些重载方法除了互相调用之外什么都不做。但是,这一整洁功能的启用码是


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

以避免歧义。Java支持方法重写。

我们假设代码如下:

public int add(int a) {
    // do something
}

public int add(int a, int b = 0) {
    // do something
}

当我们调用
add(12)
时,您能告诉我调用了哪个函数吗?

我不同意。在C++中,没有歧义——尽管它的代价是稍微限制在哪些参数中可以指定(即,不能让第一个默认,并给第二个值)。然而,当您有一个像Eclipse这样的IDE来告诉您方法的签名是什么时,这是一个小问题。FlexBuilder做得很好……除了Kelsey的观点之外,默认参数的一个优点是使方法调用更简洁。您的默认值解决方案没有这个优势。@Srinivas您在Java中使用的许多语言也是如此,解决方案是使用IntelliJ:)Java固有的笨拙和清晰使其成为IDE的理想候选。Groovy有默认参数值:因此基本上,你是说这真的很难,所以会比它的价值更麻烦?当然,有一些解决办法,但我想知道的是为什么语言设计者选择省略这个有用且看似简单的功能。这可能是一个完全没有理由的省略。有时候你只是有更优先的任务,而忽略了一些不太重要的事情。事实上,他们没有做出任何努力来实现一个特性,这证明了这一点。与此相比,
super
必须是构造函数中的第一条语句。在这里,他们进行了认真的努力,以防止整洁的编码。这就是为什么激怒了我,并提出了一个严肃的问题,因为正常人不会花精力去伤害他人。好吧,但你在猜测——你有没有一个来源来支持你的说法?编译器会显示类似“调用'add'是不明确的”更好的问题是,为什么会有两个版本的完全相同的函数,一个带有默认参数?从逻辑上讲,您应该只有add(inta,intb=0),在这种情况下调用int(12)和int(12,0)是相等的。如果add(inta)和add(inta,intb=0)相等,那么为什么有两个版本?