Java的主要重点是什么?为什么要花这么长时间才能获得新功能?


11

我一直在探索JDK8中的新功能,例如lambda表达式,扩展方法和新的流API。

显然,这些功能都不是编程世界中的新增功能,这使人们感到奇怪的是,为什么到目前为止在Java中都无法获得所有这些功能。

Lisp(1958),SML(1973),Haskell(1990),Python(1991),JavaScript(1994),Ruby(1995),Scala(2003),C#(2007)和Lisp和55年后有lambda表达式Java(2013)中几乎所有其他人。

我在SIC(1996年)中读到有关流的信息。

我一直在想为什么现在呢?有证据表明,与其他语言竞争不是动机。

看来,此Java版本中的所有很酷的新功能只是实现并行性的副产品。我们之所以拥有lambda,是因为它们使编写并行算法变得更加简单,而我们拥有扩展方法,是因为我们需要它们来支持lambda表达式所需的更改等。

因此,我的问题是:我们能否安全地确认即将发布的Java版本中的主题实际上是并行性?还是我们可以证明迄今为止使用Java编写本书中最古老的技巧的其他原因?


4
所有这些都可以变成关于Java落后时代的烈火。
Michael K

5
The evidence suggests-请分享您的研究。

2
任在Java或在JVM或JRE中的特点是不断更新的。甚至功能的结合并不是什么新事物,埃菲尔在1985年就拥有了所有这些功能(GC,OO,类型安全性,甚至Java直到2003年才获得的泛型)。实际上,引入任何新东西是Java设计人员的明确目标。
约尔格W¯¯米塔格

2
@MichaelK-我同意这可能会引发一场火焰大战。它也可能成为有关Sun充满挑战的历史的有效答案。甲骨文收购Sun和Java;以及当前的Java维护者如何尝试开发该语言。我希望答案将集中在这个问题的建设性方面。

@MichaelT:我希望它不会变成一场火焰大战,并且可能会出现一些有趣的想法。例如,我们经常假设一种不会持续发展的语言是落后于时代的。IMO的说法是不正确的,因为它假设语言的发展是线性的(所有流行的新功能都是好的,所有现代语言都应采用)。但是语言的维护者可以决定新功能与其他语言不兼容。另外,请考虑肯定没有落后于时代的标准化,稳定的语言(例如Common Lisp)。
乔治

Answers:


12

最初设计Java时,忽略匿名函数被认为是适当的。我可以想到两个原因(但可能与官方原因有所不同):

  1. Java被设计为没有功能的面向对象的语言,因此在没有功能的语言中具有匿名功能并不是很自然。或至少,这会在很大程度上影响语言的设计。
  2. 匿名功能在Java旨在吸引的程序员社区(C,C ++,Pascal?)中并不流行。即使是现在,许多Java程序员似乎仍然认为这些功能非常陌生(但是Java 8可能会很快改变这种功能)。

正如罗伯特·哈维(Robert Harvey)解释的那样,在接下来的几年中,Sun的策略始终是保持Java向后兼容和非常稳定。

另一方面,出现了其他竞争性语言(最重要的是C#,它是Java克隆而诞生的,然后发展了自己的发展方向)。

竞争的语言使Java面临压力,原因有二:

表现力

新功能可以使某些编程习惯用法更易于编写,从而使该语言对程序员更具吸引力。通常,一种语言提供的功能集是表达能力,语言复杂性和设计一致性之间的折衷:添加更多功能可以使语言更具表达力,但也更加复杂且难以掌握。

无论如何,在最近几年中,Java的竞争对手添加了Java所没有的许多新功能,这可以认为是一种优势。

炒作

是的,不幸的是,这是选择技术的一个因素,至少从我作为程序员的日常经验中可以看出:即使大多数团队成员不知道如何使用工具,工具也必须具有特定功能。那些能够使用它的人在大多数时候不需要它。

对于像经理这样的非技术人员来说,炒作可能更为重要,他们可能是决定某个项目平台的人。管理人员有时只记得一些关键字,例如lambda,并行性,多核,函数式编程,云计算等等。如果我们选择的技术在列表的每个项目上都带有绿色标记,那么我们是最新的。

因此,IMO一段时间以来一直在

  • 语言稳定性和设计简单性的原始政策,一方面是庞大的代码库和开发人员社区,并且
  • 竞争性语言的压力可能首先吸引Java程序员,首先是C#,然后是Scala,Clojure,F#(我知道我所知道的,也许还有其他)。

最终,Oracle决定升级Java以使其更具竞争力。在我看来,这些新功能特别针对那些可能会倾向于使用C#的Java程序员,他们认为其他语言(例如Scala和Clojure)与Java截然不同。另一方面,具有一定功能编程经验并且仍想使用JVM的开发人员可能已经切换到Scala,Clojure或其他语言。

因此,新的Java 8功能将使Java作为一种语言更加强大,并且声明的重点是并发和并行编程,但是升级似乎也解决了营销方面的问题(Oracle Java首席架构师Mark Reinhold说:“有些人会说添加Lambda表达式只是为了跟酷孩子在一起,这是有道理的,但是真正的原因是多核处理器;处理它们的最佳方法是使用Lambda”,请参阅本文)。

因此,是的,许多(所有)Java 8功能已经众所周知,但是为什么以及何时将功能添加到语言取决于许多因素:目标受众,现有社区,现有代码库,竞争对手,市场营销等。

编辑

关于“ ...我已经在SIC(1996)中阅读了有关流的信息”的简短说明:您是说需要Java 8 lambda来实现流吗?实际上,您可以使用匿名内部类来实现它们。


+1,但愿我能给您更多点,因为这是迄今为止对该问题的最佳答案。
edalorzo

根据您的回答,我进一步调查了马克·赖因霍尔德(Mark Reinhold)所说的内容,发现了一篇有趣的文章。我将在这里发布您的答案,以供将来参考:Mark Reinhold撰写的Java闭包
edalorzo

那篇文章实际上是指Java的另一篇Closures
edalorzo 2013年

1
从您发送的链接中,我找到了这个ibm.com/developerworks/java/library/j-jtp03048/index.html#4.0,说Java可以使用匿名内部类,但是它们太冗长了。但是,Java 8闭包不仅仅是匿名内部类的语法糖。因此,现在Java将具有两种(在语义上)不同的闭包:匿名内部类和lambda表达式。
Giorgio

11

Java已经随着时间而改变了重点。最初,它被设计为一种简单而强大的语言,是对“强大而复杂的” C ++的一种反应。故意遗漏了C ++中的某些功能,例如运算符重载,模板,枚举,这些功能被认为太复杂或C时代的遗物,而OOP处于其流行的顶峰,则一切都变成了一个对象,范式世界观。由于Java 1.1中引入了匿名/内部类,因此此时的Lambda仅被视为“不需要”。语法更加冗长的事实几乎被认为是一个功能

Java公开露面,直到微软推出C#并没有动力去改变它,C#从Java设计错误的教训中吸取了教训,并推出了一系列新的语言功能。它们不受后向兼容性的约束。我认为Java概念制定者意识到了C#竞争的危险,并发布了带有泛型,枚举等的Java 5。

从那时起,就讨论了将lambda包含在Java中的问题,而当前的函数式编程趋势才使该问题更加恶化。但是这样的事情做起来很慢,而且第一次就必须做对。在我看来,Java破坏了类型擦除的泛型,因为向后兼容性被认为是仅通过语法糖来实现它的原因。似乎已经对闭包进行了更彻底的考虑,这将不仅仅是语法糖。

总之,Java 8的主要主题是什么?我认为语言版本没有主题。作为C ++ 11,Java 8的存在理由是通过在语言中引入越来越多的程序员现在认为理所当然的东西来跟上竞争。Lisp可能从1958年就开始使用lambda,它的流行已经持续了数十年,并且直到最近才对“主流”编程(由于缺少更好的词)认真地考虑了函数式编程。


“ Lisp可能从1958年就开始使用lambda,几十年来它的流行已经停滞,直到最近才对“主流”编程认真地考虑了函数式编程”。函数式编程已经提倡了多年,但是业内大多数人认为它是研究人员喜欢用来撰写博士学位论文的一种东西。现在突然之间,该行业正在醒来,并给了它机会,也许是因为由于OOP成为主流,他们正在寻找下一个重要的东西。
Giorgio

1
闭包最初未包含在Java中的原因根据:了解闭包辩论。詹姆斯·高斯林(James Gossling)在那儿说:“最初,由于时间压力,关闭Java的原因比其他任何事情都要多。在Java的早期,缺少闭包是很痛苦的,因此内部类诞生了:试图避免这种不舒服的妥协许多困难的问题。但是在许多设计问题中,通常情况下,简化并没有真正解决任何问题,只是将其转移了。”
edalorzo 2013年

“自那时以来,人们一直在讨论将lambda包含在Java中,但只有当前的函数式编程趋势才加剧了这种情况。”:我发现有趣的是,在某些社区(C ++,Java等)中,“使用lambda”通常意味着“做函数式编程”。
乔治

8

显然,这些功能都不是编程世界中的新增功能,这使人们感到奇怪的是,为什么到目前为止在Java中都无法获得所有这些功能。

因为Java必须经过类似于“按委员会设计”的过程,涉及多个知名度较高的涉众的批准过程,而且该过程需要时间,所以就这么简单。

与其他语言相比,您会发现一个仁慈的独裁者,或一个由语言设计人员组成的小型委员会,这些委员会紧密合作且与公司利益无关。

将其与必须保持向后兼容的数百万行Java代码的已建立代码库结合在一起,您便可以轻松应对各种变化。


1
OTOH,您还拥有真正强大且被广泛接受的标准。例如,将JPA与PHP的情况(每个人的Web框架都有自己的半定ORM)进行对比。
Michael Borgwardt

我可能错了,但我的理解是Haskell还是一种“按委员会设计”的语言,并且是一种前沿的语言。所以也许这不是阻碍Java的原因吗?
Andres F.

@AndresF。是的,但是我想您在Haskell委员会中没有大型的整体公司。另请参见注释中的谈话在这里
罗伯特·哈维

1

我要说的是,要使用一种编程语言的最重要的目的。当前,C和Java没有lambda表达式,它们是最常用的语言(例如,根据TIOBE)。

回答这个问题,我相信Java是针对企业的。在这方面,事物必须非常稳定和可靠;例如Java 7已经出现了将近2年,但我不直接知道Java 7中的任何项目。另外一个重要的事情是向后兼容性,这对企业来说非常重要。


我同意您的观点(+1):我非常重视Java(作为一种语言及其庞大的生态系统),但是我发现冻结Java 6语言更合适。我不会在学习上投入任何精力。除非我被迫从事Java 7或8(必须参加一个非常有趣的项目,其中必须有Java 7或8),否则我会花时间学习Scala和Clojure。
乔治
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.