25 个喜欢 Java 的理由
JetBrains 喜欢所有编程语言,还有所有开发者! 2020 年 5 月,Java 将迎来 25 岁生日! 因此我们想做点特别的事情,想想我们喜欢 Java 和 JVM 的 25 个地方。
向后兼容性
Java 几乎是唯一一种能够在现代版本上运行 25 年前的代码的语言。 这种语言的开发者非常重视向后兼容性,由于这一点,许多组织乐意将 Java 作为他们的主要开发平台,他们了解代码在未来数年都可以在 JVM 上运行。
成熟
时间带来了优势。 过去 25 年里,开发者一直在使用 Java 为大量行业与业务类型和不同平台编写应用程序。 同时,在过去 25 年间,开发者一直在大专院校、训练营和职场学习 Java。 这创造了一个大型生态系统,这个生态系统不断总结经验并持续壮大。 Java 及其可以解决的问题得到了妥善记录并受到了供应商与非盈利组织和个人的积极支持。 Java 的成熟和广泛采用意味着对希望使用 Java 编码的开发者来说有很多工作机会,这一点对我们这样的开发者非常重要!
持续改进
与向后兼容性和成熟相对的是,平台和语言的演化。 自从 2017 年 (Java 9) 以来,每六个月就会发布一个版本,这为这门语言带来了稳定的变化和改进。 结合预览功能,该语言能够试验新语法,从开发者获取反馈,然后针对这门语言的使用者,标准化那些切实有效的新功能。
平衡
Java 极力在向后兼容性和拥抱未来之间寻求平衡。 重视向后兼容性和每六个月发布一次且每三年发布一个长期支持版本,当前的这种做法似乎可以取得恰当的平衡。 这种语言能够通过提供将被移除的弃用功能警告并用新功能替换弃用功能的方式实现演化。
需要更多稳定性的用户可以一直使用长期支持版本。 为了降低升级风险,他们可以对每六个月发布的版本进行定期测试。喜欢每六个月升级的用户可以在新版本发布后更新到最新版本的 Java。 希望在标准化之前试用新语法的开发者可以启用预览功能,而希望尽早尝鲜的用户甚至可以使用尚未发布的抢先体验版本。使用现代版本 Java 的团队可以获得各个领域最好的功能。
标准
标准可能不如语言功能那样令开发者兴奋,不过,对于 Java、Java EE、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 在金融领域广泛使用,这一领域依赖于低延迟交易和可预测的性能。
垃圾回收
在 Java 诞生 25 年后的现在,我们通常认为自动垃圾回收理所当然。 我们不必考虑内存在应用程序中的分配方式或者如何释放内存。 每个 JVM 都有一种或多种不同的垃圾回收算法,因此我们可以选择最适合我们应用程序的算法,而不必过多地担心间隔,我们可以专心为应用程序编写业务逻辑。
可观测性和管理
如果我们对应用程序的运行状况感兴趣,可以使用大量工具。 许多工具甚至是免费的,特别是从 Java Flight Recorder 和 Mission Control 成为 OpenJDK(自 Java 11 开始)的一部分以来。 像 JMX 一样的工具甚至还能让我们动态管理应用程序。
Java 虚拟机 (JVM)
我们刚刚提到的许多功能都是 JVM 的功能,但我们想专门说一下 JVM,事实上,它独立于 Java 语言。 有许多原因会让人喜欢 JVM,包括我们已经介绍的一些:WORA、运行时优化、性能、供应商选择等,其中很多都得益于标准和规范。 JVM 独立于 Java 语言也非常重要,这意味着,可以基于该平台构建不同的语言,从而既可以充分利用我们刚刚提到的 JVM 的所有出色功能,又能提供不同类型的语法和语言功能。
其他 JVM 语言
Java 幸存甚至繁荣发展的一个原因是,Java 6 与 Java 8(Java 7 有一些出色的功能,但对 Java 开发者来说,不像是一个大版本)之间平静的开发世界涌现出了其他 JVM 语言。 在 JetBrains,我们最喜欢的当然是 Kotlin,但 JVM 是一个适用于 Groovy、Scala、Clojure 和 JRuby 等其他热门语言以及大量其他新语言和重新实现语言的平台。 在许多情况下,这些语言与经典 Java 之间的互操作性可以帮助我们接受并利用这种多样性。
库和框架
最有吸引力的一个方面是我们可以选择大量的库和框架,其中的许多都开源且免费。 尤其是,像 Spring 和 Spring Boot 这样的热门框架让用户可以创建任何内容,从小型服务到大型和复杂的企业应用程序。 有标准可依意味着,如果我们一直在其他上下文中使用类似内容,通常就不难理解和使用库。 Java 的成熟和社区很早就采用开源意味着标准问题通常会有现成的解决方案,无需重新开发。 这还意味着,由于许多解决方案已经存在并使用了很长时间,它们都经过良好的测试,理解比较透彻并且记录也比较完善。
构建工具与依赖项管理
过去,可怜的开发者(像我一样!)不得不在网上搜索一些未知 JAR 文件(包含他们尝试运行的代码明显需要的一些类),这样的日子已经一去不复返了。 特别是,Maven 和 Gradle 不仅让用户可以轻松构建和部署应用程序,还能以包含所有必需依赖项的标准方式设置项目。 可以轻松地在新的或现有项目中开始编码。 Maven Central 和 Bintray 等公共存储库简化了查找(和发布)库的操作。
JUnit 和自动测试
JUnit 创建于 1997 年,基本上与 Java 拥有同样长的历史!它是 Java 领域目前最常用的自动测试框架,由于假设任何新 Java 项目都需要一个测试框架,JUnit 和 TestNG 随 IntelliJ IDEA 一起交付。 各种语言的现代测试框架可能都基于我们在 JUnit 中已经习以为常的理念。 Java 社区的自动测试文化很大程度上归功于这个库。
IDE
我们没有忘记这是关于 IntelliJ IDEA 博客! 无论您相信 Java 需要 IDE 的老生常谈,还是认为由于静态输入功能 Java 可以利用 IDE,事实都是,Java 开发者喜欢他们的 IDE(我们也爱你们!)。 学习有效使用 IDE(无论是 IntelliJ IDEA、Eclipse 还是 NetBeans)可以通过以下方式显著提升开发者的效率:代码补全与生成、运行测试、调试、导航以及大量其他功能。 Java 开发者通常对 IDE 的优势抱有极高的热情。
社区
Java 社区规模大、成熟、充满活力,并且是一个热情的社区。 全世界许多城市都有 Java 用户组,如果您无法参加现场聚会,还可以加入虚拟 Java 用户组。 Java Champions 是 Java 领域公认的技术领导者,他们以分享对 Java 和 JVM 开发者有用或开发者感兴趣的东西而为人所知。 Java 拥有一个巨大的开源社区,包括通过 OpenJDK 开源的 JDK 自身。 Java 社区重视学习、教授和持续改进,关心标准和“最佳实践”,并对如何在真实环境中应用这些非常务实。
人员
社区自然是由人组成的,但是当我问开发者他们最看重 Java 的什么时,许多人都明确提到 Java 领域对他们产生影响的个人。 其中既包括同事和教师,也包括像 Brian Goetz、Angie Jones、Georges Saab、Mala Gupta 和 Venkat Subramaniam 这样的大咖。 一些人甚至提到了我(Trisha Gee)。 就我个人来说,我使用 Java 是因为我在大学学习这种语言并且有很多工作机会,但我一直坚持下来是因为,我喜欢 Java 用户以及他们给我的帮助和支持。
Javadoc 与文档
Java 通过 Javadoc 使 API 文档成为语言的主要部分。 三种不同类型的注释(Javadoc、块和行)清楚地说明了开发者留下的说明类型。 Javadoc 特别鼓励开发者为调用方法或者使用类或包的其他开发者留下有用的文档。 如果开发者无法找到有关库或代码段的详细教程信息,通常都会有 Javadoc 可以为他们指点迷津。
此外,Java 生态系统一般可以获得(和提供)优质文档。 鼓励开源项目的潜在提交者提交 Javadoc 注释或其他文档的拉取请求,全世界的开发者都可以在 StackOverflow 上提出和回答问题,或者撰写有关特定问题解决方案的博文。
开源
不仅 Java 社区很早就开源,JDK 自身现在也通过 OpenJDK 开源。 开源让多个供应商和个人可以更轻松地参与和协作。 能够查看 Java 自身的代码也很有意思。 开源代码也为像我们一样的开发者提供了出色的机会,让大家可以从努力思考和解决复杂问题的人那里学习。
免费
Java 平台和 Java 生态系统中使用的许多最受欢迎的工具都不需要开发者(甚至是盈利组织)支付任何费用。 即使在 Oracle 于 Java 11 中更改了许可和支持后,他们(以及许多其他供应商)仍提供了在生产中免费使用这种语言的方式。 本文已经提到的开源项目、构建工具和 IDE 全都免费或者提供免费选项。 这使 Java 对刚开始编程的开发者,以及在开发软件时需要控制预算的各种规模的组织来说非常有吸引力。
面向对象
面向对象的编程并不是唯一选择,每种范例都有其优点和缺点。 Java 从一开始就设计为一种面向对象的语言,面向对象的许多设计模式示例和其他最佳编程实践都以 Java 演示。 如果您需要一种面向对象的编程语言,Java 应在您的选择清单中位居前列。
演化与适应
Java 过去是并且仍然是一种面向对象的编程语言。 但它仍成功地采用了函数编程中的某些概念(例如 lambda 表达式和不可变数据结构),并使它们在面向对象的范例中很好地运行。 类型推理(例如 var)让我们仍可以利用静态类型语言的优势,但样板代码减少。 计算机科学仍是一门相对年轻的学科,我们学习的新东西可以应用到现有工具中。 Java(语言和整个生态系统)仍在按照新趋势、新的“最佳实践”,以及各方面在现实世界中的运行效果进行演化。
Java 也会利用其他 JVM 语言中的语法和理念判断经典 Java 领域中的可取和不足之处。 即使是 Java 用于演化和发展的过程和工具(例如 JCP 和 OpenJDK),也在进行自我适应,以在这个持续的演化过程中与时俱进。 这种演化和适应是 Java 竭力实现的谨慎平衡的一部分。
注重可读性
Java 代码的可读性一般比较强,即使对于非 Java 编程者来说也是如此。 这种语言倾向于更详细而不是过于简洁,这让开发者在阅读时可以更轻松地追根溯源。 Java 开发者尚未实现运算符重载等功能,因为他们认为重要的是不被意外的自定义行为所困扰。 语言和框架倾向于避免“魔法”,但一些框架将使用惯例优于配置等范例,而开发者无需这样做,不过,肯定会摒弃进行大量带注解的 AOP,转向为文档和静态分析检查使用注解。 社区和生态系统倾向于喜欢标准和“最佳实践”,因此,即使在截然不同的项目中,Java 代码通常也遵循相似的规则。
语言功能
我们介绍了喜欢 Java 的 23 个方面,但还没有提到一项功能! 说实话,将我们自己限制为仅仅 25 个功能似乎极其困难,我们喜欢 Java 的许多方面也不总是跟语法或功能有关。 我们想特别说一下开发者最喜欢的一些功能:
- Collections API:它已伴随我们很长时间并且很适合我们!
- 便利的集合工厂方法:让创建不可修改的集合更加容易
- Streams API:Collections API 一个非常好的补充,从 Java 8 以来一直在演化。 并行流增加了一种利用现代硬件的新方式。
- Lambda 表达式:与 Streams API 结合时特别有用,单独使用时非常方便。
- Optional:表达某个方法可能不会是很有用(并阻止我们防范 NullPointerException!)的出色方式。 非常欣慰看到 Optional 自 Java 8 以来的每项改进。
- java.time:用于处理日期和时间的最新 API 是一项备受欢迎的改进
- 检查异常:人们在检查异常和运行时异常上产生分歧,但检查异常适合希望使用它们的用户。
- 注解:注解类似于编译器可以检查的文档,或者可以帮助框架解决复杂问题的注释。
- JShell:现在我们可以在 REPL 中试验 Java
- var:如果合理使用,类型推理有助于减少代码噪声
- 访问修饰符和模块化:Java 让开发者可以轻松地(从 Java 9 以来更是如此)明确代码可以访问的字段、方法、类和模块。
- switch 表达式:现在如果使用 switch,它会很漂亮!
- 有用的 NullPointerException:谁不喜欢好的 NullPointerException 呢? 现在,异常可为开发者提供有关 null 对象的更多有用信息。
- 预览功能:我们喜欢预览功能! 我们对 Records、instanceof 的模式匹配和文本块非常兴奋。
未来
我们每六个月就会获得新功能,每个长期支持版本通常开箱即可为运行的任何应用程序提供更好的性能。 Java 15(2020 年 9 月发布)应具有以下新功能:隐藏类、文本块(结束预览)、更新的 Records 预览、instanceof 的模式匹配,以及密封类。
未来,我们还希望看到以下变化:易于使用,与 Project Loom 的轻型并发,来自 Valhalla 项目的内联类型,来自 Amber 项目的更多语言变化(例如 lambda 遗留),Panama 项目将使开发者可以更轻松地访问外部 API,Leydon 项目缩短启动时间,各种垃圾回收器的更多改进,等等。
Java 的未来光明无限!