Java语言的25个优点

今天看到阮一峰老师的科技爱好者周刊,介绍了JetBrains(开发idea的公司)在五月份发布的一篇博客《25 Things We Love About Java》,现尝试将其翻译成中文的。

我们喜爱Java的25个原因

JetBrains热爱所有的编程语言和各种类型的开发者。今年五月,Java迎来了它25岁的生日!所以我们想花费一点精力介绍关于Java和JVM的25个优势。

向后兼容

Java是几乎唯一一个能够在现在的语言版本上运行25年前代码的语言。语言的开发者非常重视向后兼容,基于此,许多组织乐于使用Java作为他们的主要开发平台,知道代码在未来几年仍能在JVM上运行。

成熟

一个语言存在的久了就会有很多好处。在过去的25年里,开发者们已经使用Java语言在工业和商业领域为不同的平台写了大量的应用。同时,在这25年里,开发者已经在中学、大学、训练营和工作岗位上不断地学习了Java。这创造了大量的生态系统,从业者可以从经理里不断学习并获得成长。解决问题的过程可以在文档中沉淀下来并且从非盈利性组织和个人那里获得支持。对于像我们这样的开发者来说,更重要的是,Java的成熟和广泛使用可以给更多的java程序员提供就业的岗位。

持续改进

相对于向后兼容和成熟来说,更值得一提的是Java语言和平台的持续改进。从2017年开始(Java9)就每六个月发布一个版本了,保持一个稳定的改变流。与预览功能结合使用,该语言能够尝试新语法,从开发人员那里获得反馈,然后标准化对于使用该语言的人来说确实有效的新功能。

平衡

当前评估向后兼容和每六个月发布一次的方法,但是每三年会发布一个长期支持的版本。似乎找到了正确的平衡。该语言能够为即将删除的特性提供警告,并且替换这些消失的特性。

对于那些需要稳定的特性可以让他停留在长期版本中。为了在升级新版本时降低风险,可以在每个新版本发布后进行测试。乐于保持版本最新的人可以在每六个月版本发布时进行及时的更新。想要在标准发布之前尝试新语法的开发人员可以启用预览功能。想尽快使用的人甚至可以未发布版本的先行版,使用现代Java的人确实拥有了全世界最好的。

标准

对于开发人员来说,标准没有语言特性那么令人激动。但是有了标准确实让开发人员的工作更加轻松了。了解如何使用JDBC与数据库进行通信意味着我们不必关心数据库驱动程序是如何实现的,我们与数据库驱动程序的交互方式始终相同。在JCP是用来确定Java标准的过程之一。

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

Write Once Run Anywhere

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

性能

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

内存管理和垃圾回收

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

内部,我们可以继续为应用程序编写业务逻辑。

可观察性与管理

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

JVM

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

其他JVM语言

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

库和框架

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

生产工具和依赖管理

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

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社区重视学习、教学和不断改进,关心标准和“最佳实践”,并注重如何在实际环境中应用这些标准和实践。

社区当然是由人组成的,当我问开发人员他们在java的世界中最看重什么的时候,他们当中的许多人特别强调了对他们有影响的人。这些人的范围从同事和老师到像Brian Goetz,Angie Jones,Georges Saab,Mala Gupta和Venkat Subramaniam之类的人。甚至有人提到我。就我个人而言,我之所以来Java是因为我在大学期间学习过Java,并且有很多工作可以选择,但是我之所以留下来是因为我热爱人们以及从他们那里得到的帮助和支持。

Javadoc和文档

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

另外,Java生态系统通常似乎期望(并为开发人员提供)高质量的文档。鼓励开源项目的潜在提交者提交Javadoc评论或其他文档的pull请求,世界各地的开发人员在StackOverflow或blog上询问和回答关于特定问题解决方案的问题。

开源

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用于发展和壮大的过程和工具(例如JCP和OpenJDK)也都在适应自己,以保持与这一不断发展的关系。这种演变和适应是Java必须达到的谨慎平衡的一部分。

注重可读性

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

语言特点

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

  1. Collections API:与我们在一起已经很长时间了,并为我们提供了很好的服务!

  2. 便利的工厂方法:使创建不可修改的集合变得非常容易。

  3. Streams API:这是collections API的非常不错的添加,并且很高兴看到它自Java 8以来就在不断发展。并行流添加了一种利用现代硬件的新方法。

  4. Lambda表达式:对于Streams API尤其有用,但它本身非常方便。

  5. 可选:一种表达方法可能不会给您带来好处的好方法(并阻止我们不得不防止NullPointerExceptions!)。自Java 8以来,也很高兴看到Optional的每个改进。

  6. java.time:最新的用于处理日期和时间的API是值得欢迎的改进

  7. 受检查的异常:人们对受检查的异常与运行时的异常有不同的看法,但是对于那些希望使用它们的人来说,至少存在受检查的异常。

  8. 批注:批注就像(除其他事项外)编译器可以检查的文档一样,或者是为框架做一些繁重工作的注释。

  9. JShell:现在我们可以在REPL中使用Java了

  10. var:如果合理使用类型推断,则有助于减少代码噪声

  11. 访问修饰符和模块化:Java使得明确声明哪些代码可以访问哪些字段,方法,类和模块变得容易(自Java 9以来更是如此)。

  12. 开关表达式:现在,如果我们使用开关,它将变得不那么丑陋!

  13. 有用的NullPointerExceptions:谁不喜欢一个好的NullPointerException?现在,异常为开发人员提供了有关空值的更多有用信息。

  14. 预览功能:我们喜欢预览功能!我们对唱片感到非常兴奋; instanceof的模式匹配;和文本块。

未来

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

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

java的未来一片光明。(这是原文作者的自夸)

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值