今年5月是 Java 语言诞生25周年,JetBrains 公司在官方博客里面,总结了 Java 语言的25个优点。

https://blog.jetbrains.com/idea/2020/05/25-things-we-love-about-java/

JetBrains喜欢所有编程语言和所有类型的开发人员!今年五月,Java已经25岁了!因此,我们要特别注意它,并庆祝我们喜欢Java和JVM的25件事。

关于Java的25件事(翻译中) - 图1

向后兼容

Java几乎是独一无二的,它能够在25年前的现代版本的Java中运行代码。语言开发人员非常重视向后兼容性,因此,许多组织很高兴将Java用作主要的开发平台,因为他们知道代码仍会在JVM上运行多年。

到期

长期存在有很多优点。在过去的25年中,开发人员一直在用Java为各种行业和业务类型以及不同的平台编写应用程序。同时,在这25年中,开发人员一直在学校,大学,新兵训练营和在职学习Java。这创建了一个大型生态系统,该生态系统有时间从经验中学习并持续增长。供应商,非营利组织个人对Java及其可以解决的问题进行了充分的文档记录和良好的支持。对于像我们这样的开发人员而言,非常重要的是,Java的成熟和广泛采用意味着对于想要使用Java进行编码的开发人员来说,有很多工作!

不断改进

与向后兼容和成熟相反,是平台和语言的发展。自2017年(Java 9)起,每六个月发布一个新版本,这使该语言不断进行更改和改进。结合预览功能,该语言能够尝试新的语法,从开发人员那里获得反馈,然后标准化对于使用该语言的人来说确实有效的新功能。

平衡

Java在向后兼容性和拥抱未来之间很难取得平衡。当前评估向后兼容性并每六个月发布一次的方法,但是每三年发布一次长期支持,似乎达到了适当的平衡。通过为将被删除的不推荐使用的功能提供警告,并通过替换可能消失的功能该语言得以发展。

那些希望获得额外稳定性的用户可以继续使用长期支持版本。为了降低升级时的风险,他们可能会定期针对每个新版本进行测试。那些乐于每六个月升级一次的人可以在Java每次发布时更新到最新版本。想要在标准化之前就尝试新语法的开发人员可以启用预览功能,而想要尽快使用预览功能的开发人员甚至可以使用尚未发布的版本的Early Access版本。使用Java现代版本的团队确实可以拥有世界上最好的。

标准品

标准对于开发人员而言可能不像语言功能那样令人兴奋,但是拥有适用于Java,Java EEJakarta EE的标准以及开发人员所遇到的常见用例,确实使开发人员的工作变得更加轻松。了解如何使用JDBC与数据库进行通信意味着我们不必关心数据库驱动程序是如何实现的,我们与数据库驱动程序进行交互的方式始终相同。在JCP是用来确定Java标准的过程之一。

Java语言规范涵盖了诸如如何编译器应该工作什么的Java的语言样子。它包括Java内存模型,它可以帮助我们预测应用程序的行为方式,而与JVM或硬件无关。在Java虚拟机规范涵盖了较低级别的细节倒在JVM。这些规范使在不同平台上运行的,由不同供应商分发的JDK能够以指定的可预测方式运行。导致我们……

写一次即可在任何地方运行

WORA是Java背后的原始思想之一,如今看来如此显而易见,以至于我们甚至可能都没有意识到它的突破性。我记得曾在一个非常大的组织中工作过,该组织早在2002年就从以前的技术堆栈切换到Java,这仅仅是因为他们周围有很多不同的硬件,并且能够在上面运行新的Java应用程序,而不必为应用程序购买特定的硬件是他们将所有开发转移到Java的主要原因之一。在当今的Cloud时代,这似乎无关紧要,但实际上,仅仅因为我们并不总是看到WORA发挥作用,并不意味着我们仍没有利用它。当然,如果您使用的是IntelliJ IDEA(或NetBeans),则可以在桌面上利用WORA。

性能

对于那些不太熟悉Java的人来说,有时会感到惊讶,但是Java是一种非常高性能的语言。它是一个成熟的平台,具有25年的性能改进;具有不同性能配置文件的大量垃圾收集器;JVM在运行时针对实际生产用例优化了代码,这比大多数人类开发人员所能做到的要好得多。例如,Java在金融领域得到广泛使用,这取决于低延迟事务和可预测的性能。

内存管理和垃圾回收

自动垃圾收集是25年以来我们通常认为理所当然的另一件事。我们不必考虑在应用程序中如何分配内存或如何释放内存。每个JVM具有一个或多个不同的GC算法,因此我们可以选择一种对我们的应用程序运行良好的算法,而不必过多地关注内部,我们可以继续为应用程序编写业务逻辑。

可观察性与管理

如果我们对应用程序运行时的运行状况感兴趣,则可以使用许多工具。其中许多甚至是免费的,特别是因为Java Flight RecorderMission Control现在已成为OpenJDK的一部分(自Java 11起)。诸如JMX之类的工具甚至还允许我们动态管理我们的应用程序。

Java虚拟机(JVM)

我们刚刚提到的许多功能都是JVM的功能,但是我们特别想调出JVM,以及它与Java语言是分开的事实。喜欢JVM的原因很多,其中包括我们已经介绍的一些内容:WORA,运行时优化,性能,供应商选择等,其中许多是由于标准和规范才得以实现的。JVM也必须与Java语言分开,这一点也很重要。这意味着可以在平台上构建不同的语言,从而利用我们刚刚提到的JVM的所有强大功能,同时提供不同类型的语法和语言功能。

其他JVM语言

Java在Java 6和8之间的那些安静的岁月中得以幸存甚至兴盛的原因之一(Java 7具有一些强大的功能,但对于Java开发人员来说并不是一个很大的版本)是由于其他JVM语言所致。当然,在JetBrains,我们最喜欢的是Kotlin,但是JVM是其他流行语言(例如GroovyScalaClojureJRuby)以及大量其他新的和重新实现的语言的平台。在许多情况下,这些语言与经典Java之间的互操作性有助于我们拥抱和利用这种多样性。

库和框架

最引人注目的争论之一是我们拥有大量的库和框架可供选择,其中许多是开放源代码且可以免费使用。诸如SpringSpring Boot之类的流行框架使创建从小型服务到大型复杂企业应用程序的一切变得容易。标准意味着,当我们在另一个环境中使用类似的东西时,通常并不难理解和使用一个库。Java的成熟以及社区对开源的早期采用,意味着通常存在针对标准问题的现有解决方案。无需重新发明轮子。这也意味着,由于许多此类解决方案已经存在并投入使用很长时间了,因此它们已经过了充分的测试,理解和记录。

生成工具和依赖管理

贫穷的开发人员不得不在Internet上搜索一些未知的JAR)文件的日子已经一去不复返了,这些文件包含他们试图运行的代码显然需要的类。尤其是,Maven和Gradle使构建和部署应用程序变得容易,而且还以标准方式设置了具有所有必需依赖项的项目。在新项目或现有项目中开始编码都非常简单。Maven CentralBintray之类的公共存储库为我们提供了查找(和发布)库的著名场所。

JUnit和自动化测试

JUnit的在1997年创造了这样几乎是一样古老Java本身!它是迄今为止Java世界中最常见的自动化测试框架,并且IntelliJ IDEA附带了JUnit和TestNG,因为它假定任何新的Java项目都将需要测试框架。面向所有语言的现代测试框架很可能基于我们现在认为来自JUnit的想法。Java社区的自动测试文化应归功于这一库。

集成开发环境

这是IntelliJ IDEA博客,我们不会忘记这个博客!无论您是相信Java的冗长性需要IDE,还是因为它的静态类型而实际上Java可以真正利用IDE,事实都是Java开发人员喜欢他们的IDE(我们也爱您!)。学习有效地使用IDE(无论是IntelliJ IDEA,Eclipse还是NetBeans),可以通过以下方式显着提高开发人员的生产率:代码完成生成运行测试调试导航其他一系列功能。Java开发人员通常对IDE带来的好处非常热情。

社区

Java社区是一个大型,成熟,充满活力且热情的社区。全球许多城市都有Java用户组,如果您无法参加物理聚会,则有一个虚拟Java用户组。在Java的冠军被公认的技术领导者在Java世界中谁出名为共享的东西都是有用或有趣的Java和JVM开发。Java具有庞大的开源社区,包括通过OpenJDK的JDK本身。Java Community重视学习,教学和不断改进,关心标准和“最佳实践”,并且对于在实际环境中应用这些标准务实。

当然,社区是由人组成的,但是当我问开发人员对Java的最重视时,其中许多人专门指出了影响Java的Java世界中的个人。这些人的范围从同事和老师到像Brian GoetzAngie JonesGeorges SaabMala GuptaVenkat Subramaniam之类的人。甚至有人提到。就我个人而言,我之所以来Java是因为我在大学期间学习过Java并且有很多工作,但是我之所以留下来是因为我热爱人们以及从他们那里得到的帮助和支持。

Javadoc和文档

Java通过Javadoc使API文档成为语言的关键部分。三种不同类型的注释(Javadoc,块和行)清楚地表明了开发人员要留下的注释类型。Javadoc特别鼓励开发人员将有用的文档留给其他调用方法或使用类或包的开发人员。如果开发人员无法在库或代码段中找到详细的教程信息,通常可以使用Javadoc来帮助他们指出正确的方向。

此外,Java生态系统通常似乎期望(并为开发人员提供)高质量的文档。鼓励准开源项目的提交者提交Javadoc注释或其他文档的拉取请求,并且全世界的开发人员都可以在StackOverflow上或在博客上询问有关特定问题的解决方案。

开源的

Java社区不仅在早期就接受开源,而且现在JDK本身也通过OpenJDK成为开源。开源使多个供应商和个人更容易参与和协作。能够查看Java本身的代码也很有趣。开源代码为像我们这样的开发人员提供了一个很好的机会,可以向已经完成所有思考和解决复杂问题的艰苦工作的人们学习。

自由

Java平台和Java生态系统中使用的许多最流行的工具都不需要开发人员(甚至常常是牟利组织)来支付使用它们的费用。即使Oracle 更改了Java 11的许可和支持之后,他们(以及许多其他供应商)仍然提供了一种在生产中免费使用该语言的方法。本文中已经提到的开源项目,构建工具和IDE都是免费的或具有免费选项。这使得Java吸引了开发人员开始进行编码,以及吸引了所有需要构建软件同时关注预算的各种规模的组织。

面向对象

当然,面向对象的编程并不是唯一的游戏,每个范例都有其优点和缺点。Java从一开始就被设计为一种OO语言,并且用Java演示了许多设计模式示例和其他面向OO的编码最佳实践。如果您想要一种面向对象的编程语言,则Java应该是您尝试使用的语言之一。

进化与适应

Java曾经是,现在仍然是一种面向对象的编程语言。但是它也已经成功地从函数式编程中采用了一些概念(例如lambda表达式和不可变的数据结构),并使它们在OO范式中很好地工作。类型推断(例如var)使我们仍然可以使用静态类型语言的好处,但模板更少。计算机科学仍然是一门相对年轻的学科,但是随着我们学习事物,它们可以应用于我们现有的工具。Java(语言和整个生态系统)是根据新趋势和新的“最佳实践”不断发展的,也是看到现实世界中事物如何运转的结果。

Java还可以从其他JVM语言的语法和思想中受益,以了解有效的方法以及在经典Java世界中可能不适用的方法。甚至Java用于发展和壮大的过程和工具(例如JCPOpenJDK)也都在适应自己,以保持与这一不断发展的关系。这种演变和适应是Java必须达到的谨慎平衡的一部分。

注重可读性

Java代码通常是可读的,即使对于非Java程序员也是如此。该语言倾向于更加冗长而不是过于简洁,这使得我们在阅读Java代码时更容易推理。语言开发人员尚未实现运算符重载之类的功能,因为他们认为不要因意外的自定义行为而感到惊讶,这一点很重要。在语言和框架中,有一种避免“魔术”的趋势-尽管某些框架将使用Convention(而非约定)之类的东西来进行配置,而无需开发人员一定要这样做。肯定有一个转变,例如,使用批注进行大量的AOP,以及使用注释进行文档和静态分析检查的更多内容。社区和生态系统倾向于喜欢标准和“最佳实践”,因此即使在非常不同的项目上,Java代码也经常遵循类似的规则。

语言功能

我们已经介绍了23篇关于Java的内容,但是并没有提到一个功能!老实说,这是因为将自己限制为仅25个功能似乎非常困难,并且因为我们对Java的很多爱好与语法或功能无关。我们想对开发人员最喜欢的一些功能大声疾呼:

  • Collections API:与我们在一起已经很长时间了,并为我们提供了很好的服务!
  • 便利的工厂方法:使创建不可修改的集合变得非常容易。
  • Streams API:集合API的非常不错的补充,并且自Java 8以来就可以看到它的不断发展。并行流添加了一种利用现代硬件的新方法。
  • Lambda表达式:对于Streams API尤其有用,但它本身非常方便。
  • 可选:一种表达方法可能不会给您带来好处的好方法(并阻止我们不得不防止NullPointerExceptions!)。自Java 8以来,也很高兴看到Optional的每个改进。
  • java.time:最新的用于处理日期和时间的API是值得欢迎的改进
  • 受检查的异常:人们对受检查的异常与运行时的异常有不同的看法,但是对于那些希望使用它们的人来说,至少存在受检查的异常。
  • 批注:批注就像(除其他事项外)编译器可以检查的文档一样,或为框架做一些繁重的工作而提供的注释。
  • JShell:现在我们可以在REPL中使用Java了
  • var:如果明智地使用类型推断,则有助于减少代码噪声
  • 访问修饰符模块化:Java使得明确声明哪些代码可以访问哪些字段,方法,类和模块变得容易(自Java 9以来更是如此)。
  • 开关表达式:现在,如果我们使用开关,它会变得不那么丑陋!
  • 有用的NullPointerExceptions:谁不喜欢一个好的NullPointerException?现在,异常为开发人员提供了有关空值的更多有用信息。
  • 预览功能:我们喜欢预览功能!我们对唱片感到非常兴奋; instanceof的模式匹配;和文本块

当然,我们还提供了一个视频,显示所有这些功能,请使用IntelliJ IDEA!

未来

我们每六个月获得一次新功能,每个LTS版本通常为运行于其上的任何应用程序提供开箱即用的更好性能。Java 15(2020年9月)应该具有:隐藏类;文本块(不再预览);更新了记录的预览;instanceof的模式匹配;和密封类的预览。

展望未来,我们还希望看到:Project Loom易于使用,轻量级并发;Valhalla项目的内联类型; 来自Amber项目的更多语言更改例如lambda剩余的内容;巴拿马计划将使程序员更轻松地访问外部API。莱顿项目(Project Leydon)缩短了启动时间; 对各种垃圾收集器进行更多改进;还有更多。

Java的前途一片光明!