Java让我们喜爱的地方

2020-06-19 10:29:16

JetBrains热爱所有编程语言和各种类型的开发人员!今年五月,Java就满25岁了!因此,我们要特别关注它,并庆祝我们喜欢Java和JVM的25个方面。

Java几乎是独一无二的,因为它能够在现代版本的Java上运行25年前的代码。语言开发人员非常认真地对待向后兼容性,正因为如此,许多组织都乐于将Java作为他们的主要开发平台,因为他们知道代码在未来几年仍将在JVM上运行。

在这里生活很长时间有很多好处。在过去的25年里,开发人员一直在用Java为各种行业和业务类型以及不同的平台编写应用程序。同时,在这25年中,开发人员一直在学校、大学、新兵训练营和工作中学习Java。这创造了一个巨大的生态系统,它有时间从经验中学习,并继续增长。Java,以及它可以解决的问题,都有很好的文档记录,并得到了供应商、非营利组织和个人的大力支持。对于我们这样的开发人员来说,非常重要的是,Java的成熟和广泛采用意味着想要用Java编写代码的开发人员有很多工作可做!

与向后兼容和成熟相反,是平台和语言的演变。自2017年(Java9)以来,每六个月就会有一个新版本发布,这使得该语言有了源源不断的变化和改进。与预览功能相结合,该语言能够试验新的语法,从开发人员那里获得反馈,然后标准化新功能,这些新功能对于使用该语言的人来说工作得很好。

Java很难在向后兼容和拥抱未来之间取得平衡。目前的方法是重视向后兼容性,每六个月发布一次,但长期支持版本每三年发布一次,这似乎取得了正确的平衡。该语言能够通过为将被移除的不推荐使用的功能提供警告,并通过替换任何可能消失的功能来进行发展。

那些希望额外稳定的人可以留在长期的支持释放上。为了在升级时降低风险,他们可以定期针对每个新版本进行测试。那些乐于每六个月升级一次的用户可以在Java每次发布时更新到最新版本。想要在新语法标准化之前尝试新语法的开发人员可以启用预览功能,而那些想尽快这样做的开发人员甚至可以使用尚未发布的版本的早期访问版本。使用现代版本Java的团队真的可以拥有最好的一切。

对于开发人员来说,标准可能没有语言功能那么令人兴奋,但是拥有针对Java、JavaEE和Jakarta EE以及开发人员遇到的常见用例的标准确实会使开发人员的工作变得更轻松。了解如何使用JDBC与数据库通信意味着我们不必关心数据库驱动程序是如何实现的,我们与其交互的方式总是相同的。JCP是用于确定Java标准的过程之一。

Java语言规范涵盖了Java语言的外观以及编译器应该如何工作。它包括Java内存模型,它可以帮助我们预测应用程序可能的行为方式,而与JVM或硬件无关。Java虚拟机规范涵盖了JVM中的底层细节。这些规范使不同供应商分发的、运行在不同平台上的JDK能够以指定的、可预测的方式运行。这让我们找到了…

WORA是Java背后的原始想法之一,如今这一点似乎如此明显,以至于我们甚至可能没有意识到它有多么开创性。我记得在一个非常非常大的组织工作,早在2002年,他们就从以前的技术堆栈转换到Java,仅仅是因为他们有很多不同的硬件,能够在上面运行新的Java应用程序,而不是必须为应用程序购买特定的硬件,这是他们将所有开发转移到Java的主要原因之一。在这个云时代,这可能看起来不那么重要,但事实上,仅仅因为我们不总是看到WORA在行动,并不意味着我们没有利用它。当然,如果您使用的是IntelliJ IDEA(或NetBeans),那么您就是在利用桌面上的WORA。

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

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

如果我们对应用程序运行时发生的事情感兴趣,我们可以使用大量的工具。其中许多甚至是免费的,特别是因为Java飞行记录器和任务控制现在是OpenJDK的一部分(从Java11开始)。像JMX这样的工具甚至还允许我们动态管理我们的应用程序。

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

Java在Java6和Java8(Java7有一些很棒的特性,但对于Java开发人员来说并不像是一个大版本)中存活下来,甚至蓬勃发展的原因之一是因为其他JVM语言。在JetBrains,我们最喜欢的当然是Kotlin,但JVM是其他流行语言的平台,如Groovy、Scala、Clojure和JRuby,以及大量其他新的和重新实现的语言。在许多情况下,这些语言和经典Java之间的互操作性帮助我们接受并利用这种多样性。

最有说服力的论据之一是我们有大量的库和框架可供选择,其中许多都是开放源码的,并且可以免费使用。流行的框架,如Spring,特别是Spring Boot,使得创建从小型服务到大型复杂的企业应用程序变得非常容易。标准意味着,当我们在另一个上下文中使用类似的东西时,理解和使用库通常并不困难。Java的成熟和社区对开放源码的早期采用意味着标准问题通常已经有了解决方案;没有必要重新发明轮子。这也意味着,由于这些解决方案中的许多已经存在并使用了很长时间:它们经过了良好的测试、充分的理解和良好的文档记录。

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

JUnit创建于1997年,因此几乎和Java本身一样古老!它是迄今为止Java世界中最常见的自动化测试框架,JUnit和TestNG都随IntelliJ Idea一起提供,因为它假定任何新的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的什么时,他们中的许多人都特别提到了Java世界中对他们产生影响的个人。这些人从同事和老师,到布莱恩·戈茨(Brian Goetz)、安吉·琼斯(Angie Jones)、乔治·萨布(Georges Saab)、马拉·古普塔(Mala Gupta)、文卡特·苏布拉马尼亚姆(Venk。有些人甚至提到了我。就我个人而言,我来到Java是因为我在大学里学到了Java,那里有很多工作,但我留下来是因为我喜欢那里的人们,以及他们给我的帮助和支持。

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

此外,Java生态系统似乎通常希望(并为)开发人员提供高质量的文档。我们鼓励开放源码项目的潜在提交者提交Javadoc评论或其他文档的拉取请求,世界各地的开发人员可以在StackOverflow或博客上询问和回答有关特定问题的解决方案的问题。

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

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

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

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

Java还可以从其他JVM语言的语法和思想中获益,看看哪些可以工作,哪些可能不适合传统的Java世界。甚至Java用来发展和增长的进程和工具,如JCP和OpenJDK,也在不断调整自身以保持与不断发展的关系。这种进化和适应是Java必须达到的谨慎平衡的一部分。

Java代码通常是可读的,即使对于非Java程序员也是如此。该语言倾向于更加冗长,而不是过于简练,这使得我们在阅读Java代码时更容易对其进行推理。语言开发人员还没有实现像操作符重载这样的功能,因为他们认为不要对意外的自定义行为感到惊讶是很重要的。有一种在语言和框架中避免“魔术”的趋势--尽管一些框架会使用约定而不是配置这样的东西来做事情,而不需要开发人员强制执行。例如,肯定已经不再使用注释进行大量的AOP,而是更多地使用注释进行文档和静态分析检查。社区和生态系统倾向于喜欢标准和“最佳实践”,因此即使在非常不同的项目上,Java代码也经常遵循类似的规则。

我们已经介绍了23个我们喜欢的Java特性,但没有提到一个特性!老实说,这是因为将自己限制在只有25个特性上似乎极其困难,还因为我们喜欢Java的许多事情与语法或特性无关。我们想向开发人员最喜欢的一些特性发出光荣的呼喊:

收藏品API:它已经和我们在一起很长时间了,并且为我们提供了很好的服务!

Streams API:集合API的一个非常好的补充,很高兴看到它从Java8开始就在不断发展。并行流增加了一种利用现代硬件的新方法。

Lambda表达式:对于Streams API特别有用,但本身也非常方便。

可选:一种很好的表达方法可能不会给您带来什么的方式(这样我们就不必保护自己不受NullPointerExceptions的影响了!)。很高兴看到自Java8以来对可选的每一项改进。

受控异常:人们对受控异常和运行时异常的看法不一,但至少对于那些希望使用它们的人来说,受控异常是存在的。

注释:注释类似于(尤其是)编译器可以检查的文档,或者类似于框架执行某些繁重任务的注释。

访问修饰符和模块性:Java使得明确哪些代码可以访问哪些字段、方法、类和模块变得更加容易(从Java9开始更是如此)。

有用的NullPointerException:谁不喜欢好的NullPointerException呢?现在,这些异常为开发人员提供了更多关于哪些内容为空的有用信息。

预览功能:我们喜欢预览功能!我们对记录、instanceof的模式匹配和文本块感到非常兴奋。

我们还有一段视频展示了所有这些功能,当然是IntelliJ Idea!

我们每六个月就会有新的特性,而且每个LTS版本通常都会为在其上运行的任何应用程序提供更好的开箱即用的性能。Java15(2020年9月)应该有:隐藏类;文本块(不再预览);记录的更新预览;instanceof的模式匹配;以及密封类的预览。

在更远的将来,我们也希望看到:易于使用,与Project Loom的轻量级并发;Project Valhara的内联类型;Project Amber的更多语言更改,如lambda剩余;Project巴拿马将使程序员更容易访问外国API;由于Project Leydon,启动时间更短;对各种垃圾收集器的更多改进;等等。