为什么Null-Safe运算符(例如“ Elvis运算符”)被Java 7的“项目代币”拒绝?


10

Java 7的“项目硬币”的建议功能之一是“猫王运算符”。一个2009年的JavaOne大会上演示的报告对项目硬币将其形容为这样的:

本演示文稿介绍的“小功能”之一是所谓的“猫王运算符”,这是三元运算符的更简洁版本。我发现自己在使用传统Java时缺少了Groovy的某些功能,如果添加了它,这将是我可以同时使用两种语言的一种运算符。“ Elvis”运算符可方便地指定默认值,该默认值可在评估表达式为null时使用。像Groovy的安全导航运算符一样,这​​是一种指定如何避免不必要的null的简洁方法。我以前在博客中写过关于如何避免NullPointerException的博文。

尽管最终实现了Project Coin的其他方面,但这一方面并未实现。尽管猫王运算符在JavaOne上被提出可能被纳入,但为什么最终还是被拒绝了?

明确地说,我要特别询问该运算符,以及它被拒绝作为Java 7“ Project Coin”的一部分的原因,因为当时已对其进行了认真考虑。我怀疑在讨论了拒绝邮件的原因的邮件列表或此类邮件列表,但找不到任何东西。如果有更多关于为什么它不包含在Java的任何版本中的一般信息,则可以接受,但不是首选。


4
多疑的性格?
伊万

1
Mot可能是因为它支持并鼓励使用null作为合法值,并且从根本上说,这与OO原则背道而驰,因为您在执行方法之前先检查对象的类型。
JacquesB

除非有人要找出决策过程的显式文档(电子邮件,备忘录,成绩单),或者是决策的直接参与者,否则我们真的无法在这里知道答案。例如,罗伯特的答案仅仅是猜测和一般的语言设计考虑因素,而不是拒绝该运算符的事实和具体原因。因此,我投票以基于意见的方式结束这个问题。
阿蒙

1
@amon:我自由地承认我的回答是在帖子开头的猜测。但是,无论如何,我还是发布了一个答案,因为1.我正在教如何钓鱼而不是给鱼钓鱼;以及2.如果我们打得正确,该帖子可以用作近距离欺骗的目标。提供一般分析的答案背后的想法是,阻止无休止的关于分钟语言决策的争论,并帮助其他人从整体上看待总体问题。
罗伯特·哈维

@RobertHarvey一个“为什么语言X不具有特征Y”的典型伪造目标会很方便,但是目前形式的问题似乎并不适合于此。如果它要编辑问这个一般性问题(使用X =的Java / Y = ?.作为一个例子),这肯定会是过于宽泛作为一个普通的问题,但你将有一个很好的答案。
阿蒙(Amon)

Answers:


15

自然,提出这个问题的最佳人选是JCP执行委员会的人,而不是我们。但是,这不会阻止我进行一些闲置的猜测。

每个“为什么不实现此功能”问题的答案始终是因为收益不超过成本。

Eric Lippert(C#团队的前成员)说,要使产品具有功能,该功能必须是:

  • 首先想到的
  • 想要的
  • 设计的
  • 指定的
  • 已实施
  • 经过测试
  • 记录
  • 运给客户

换句话说,在实现任何新的编程语言功能之前,必须发生许多重要的事情。成本比您想象的要大。

在C#团队中,每个新功能请求的评分都为负100。然后,团队评估收益和成本,为收益加分,为成本减分。如果分数不超过零,则建议的功能将被丢弃。换句话说,新功能必须提供引人注目的好处。

猫王操作员将其纳入C#。那么为什么不将其纳入Java?

尽管Java和C#具有明显的相似性,但它们的语言理念却截然不同。 Java企业程序往往是大型的结构化体系结构集合,这一事实证明了这一点。简洁和语言表达能力被牺牲在仪式的祭坛上,并且易于编码。开发团队的每个人都可以识别的众所周知的软件架构模式比语言的便利性更受青睐。

考虑以下Reddit交换

从7开始,对于每个Java版本都提出了Elvis运算符,但每次都被拒绝。从“纯”到“实用”,不同的语言落在频谱的不同点上,实现Elvis运算符的语言的确比Java更趋于实用。

如果您有一个由15年以上Java专业人员组成的团队,他们在编写某种高度分布式,高度并行的后端处理系统,那么您可能希望具有高度的体系结构严格性。

但是,如果您有一个初级到中级团队,其中一半是从Visual Basic迁移而来的,并且您让他们编写了一个ASP.NET Web应用程序,而该应用程序只执行CRUD操作...那么设计一堆可能就太过分了的AbstractFactoryFactory类可以抽象出您无法控制必须使用的糟糕旧版数据库中哪些列可为空的事实。

语言哲学上的这些深刻差异不仅扩展到语言的使用方式,还扩展到语言设计过程本身的执行方式。C#是仁慈的独裁者语言。 要获得C#的新功能,您只需要说服一个人:Anders Hejlsberg即可

Java采用了更为保守的方法。为了使Java具有一项新功能,它必须获得Oracle,IBM,HP,Fujitsu和Red Hat等大型供应商的一致同意。显然,该过程将较慢,并且会为新的语言功能提供更高的标准。

问题“为什么不实现x功能...”始终隐含以下单词:“ ...如果这显然是个好主意?” 正如我在此处已充分说明的那样,选择从未如此简单。


8
讽刺:因为AbstractFactoryFactory类很好地表明了体系结构的严格性,而不是代码膨胀。/讽刺。
马查多

2
@RobertHarvey您对委员会在Java语言设计中的作用的结论太简单了。尽管确实与社区和行业合作伙伴进行了合作,但Java语言是“按委员会设计”的说法几乎是完全不正确的,并且是对此发帖人的问题的一种可怕的解释(尽管可悲,表面上是可信的)。
布赖恩·戈茨

5
您列出的大多数先前原因-每个语言​​功能都比任何人都认为的要大,有限的预算(努力,变革,复杂)是准确的。我要补充一点:我们不使用功能X,因为我们认为其他功能Y和Z是更好的选择。此外,我们还比其他语言采用了更为保守的方法,因为我们知道每个功能在将来都会与其他可能的功能进行交互,或者在某些情况下会取消其他可能的功能。我们希望Java在20年后保持活力和相关性,这必然意味着不要对现在看起来很酷的每个功能都塞满。
布赖恩·格茨 Brian Goetz)

1
@BrianGoetz:由于问题似乎是“按委员会设计”一词的贬义性质(您会注意到,我没有以其他任何方式贬低Java),因此我对答案做了些微改动,以删除该词。
罗伯特·哈维

1
C#和Java设计人员之间曾经存在一些竞争。Java设计师认为C#是抢劫犯(正确的做法是)。C#代表因为“不面向对象”而被拒绝,但真正的原因是因为他们首先出现在C#中。令人高兴的是,仅出于合理原因才添加或省略了某些功能……我对此表示怀疑。
弗兰克·希勒曼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.