2023 年 Java 的主要趋势:Project Loom、Spring、新功能
似乎 30 年前 Java 才首次引起大家的关注,并改变了此后几十年软件工程的面貌。但它在今天仍然有意义吗?
在本文中,我们将介绍这种多功能且经久不衰的编程语言,以及它如何不断发展并适应不断变化的软件开发格局。从新的语言特性到创新的框架和工具,让我们探索 Java 社区目前的热点。
CRaC 项目
近来,Java 的性能得到了很大的提升。前三个趋势都是更大的努力的一部分,旨在让 Java 在启动时间、高吞吐量并发性和微小占用空间是关键的工作负载上保持相关性。
第一个是 Project CRaC,即检查点协调恢复。您可以将其视为笔记本电脑上的休眠模式。如果您合上笔记本电脑的盖子,大多数操作系统都会对计算机的当前状态进行快照。当您打开它时,操作系统会恢复该快照。这样做可以使恢复过程快速且可预测。配备 CRaC 的 Java 工作负载也是如此。
将 CRaC 添加到工作负载中的初步结果非常令人鼓舞。CRaC 项目本身报告称,其示例 Spring Boot 恢复将 Boot 启动时间从 3,800 毫秒缩短至 38 毫秒,这是一个令人印象深刻的 100 倍改进。同样,Micronaut 从 1,000 毫秒缩短至 46 毫秒,Quarkus 从 980 毫秒缩短至 33 毫秒。
目前,CRaC 不是 Java SE 的一部分,但您可以按照 CRaC 团队在其GitHub 存储库中的文档进行尝试。
Loom 项目
另一个提高 Java 性能的活跃研究领域是 Project Loom。它具体旨在通过两项创新来简化和增强 Java 应用程序中的并发性:虚拟线程(也称为绿色线程)和结构化并发。
虽然 Java 的平台线程表现良好,并且迄今为止取得了长足进步,但它们也有局限性。平台线程受限于给定机器上的内核数量。平台线程之间的上下文切换成本高昂。而且平台线程无法轻松利用 CPU 缓存亲和性。这些限制催生了线程池和每个线程请求等策略,这些策略也有自己的局限性(例如,线程使用之间可能会发生数据泄漏)。
为了解决这个问题,Project Loom 引入了虚拟线程 - 由 JVM 而不是操作系统管理的轻量级线程。由于它们由 JVM 管理,因此它们的上限比 CPU 数量高出几个数量级,切换成本要低得多,并且 JVM 可以从同一堆栈运行类似的任务。研究表明,仅限于四个平台线程的类似应用程序(因为机器上有四个 CPU)可以轻松扩展到超过 100,000 个虚拟线程。
Java 多线程应用程序中出现的另一个常见问题是,一个线程需要等待并使用另一个线程的结果。整个框架(如 RxJava 和 Project Reactor)都是围绕这个问题而诞生的,还有语言级构造和 API(如 synchronized 关键字和 CompletableFuture)。
因此,Project Loom 还引入了结构化并发:一种简化的 API,允许应用程序将一组相关的并发操作描述为一个完整的任务。这个新的 API 将使通过错误传播取消任务、查看任务层次结构变得更加简单,并且(希望)消除多年来以反应式编程形式采用的大部分复杂性。
本机编译
Java 三种性能趋势中的最后一个是本机编译,它允许将应用程序编译为机器代码,而不是依赖 JVM 来解释中间字节码。
原生编译由 GraalVM 实现,GraalVM 是一款高性能 JDK,附带一个非常方便的原生映像实用程序。此实用程序使用提前编译(而不是 JVM 的传统即时编译)来创建原生机器代码。这种提前编译还允许大量代码修剪,从而减少应用程序的整体大小。结果是应用程序几乎可以立即启动,并且占用空间非常小。它自然也更安全,因为您发送的代码越少,需要保护的代码就越少。
采用的一个挑战是需要解决 Java Reflections 库的使用问题。为了使 GraalVM 的代码修剪工作正常进行,它需要提前确定要使用哪些类。鉴于反射会掩盖这一选择直到运行时,GraalVM 可以修剪它认为不需要但在运行时通过反射访问时显示为缺失的类。
正因为如此,长期使用反射作为秘密武器的 Spring 等框架一直在努力确保 GraalVM 能够正确可靠地修剪和优化其框架代码。
Spring Framework、Quarkus 及其他
正如前面提到的,企业 Java 框架正在努力跟上整个行业的 Java 创新和变化。
每个框架都在竞争以获得最佳的启动时间、内存占用和第一个字节的时间。这对整个 Java 生态系统来说是一件好事。当框架竞争时,我们就会获胜。随着时间的推移,我们应该会看到它们扩大对 CRaC、Loom 和本机编译的支持。
此外,对于这些功能强大的 Java 框架来说,云就绪、DevOps 友好和对社区参与开放仍然是首要任务。
想要开始使用 Spring 框架吗?请查看我的文章:“开始使用 Spring。 ”
模式匹配、文本块和记录
最后但并非最不重要的一点是,我们拥有新的语言功能。尽管 JDK 17 于 2021 年 9 月正式发布,但行业采用仍在进行中。其中许多功能都具有双重目标:减少样板和减少程序员错误。
寻找这三个特性来在您编写的代码中进行大幅度和小幅度的转变。
文本块
从历史上看,多行 Java 字符串相当难以阅读,尤其是当需要转义引号时。
考虑需要将一些 JSON 代码写为 Java 字符串,如下所示:
```java
String order = “{“ +
\”id\”: \”1de57f-3ac2\”, ” +
\”date\”: \”2023-08-11\”, ” +
\”total\”: \”314.15\”” +
“}”;
```
额外的引号和转义使其难以阅读,甚至更难以书写。
如果你已经是 2023 年了,并且仍在编写多行字符串,那么是时候升级并尝试这样的方法了:
```java
String order = “””
{
“id”: ”1de57f-3ac2”,
”date”: ”2023-08-11”,
”total”: ”314.15”
}
”””;
```
除了更易读、更易于编写之外,还有一个额外的好处,就是现在编写的内容看起来像原生 JSON。
模式匹配
模式匹配是最近几个 Java 版本中的一个主题。有两个具体实例值得您关注(然后开始期待更多)。
第一个是模式匹配的实例。此功能是 Java 中备受欢迎的进化,并加入了类型检查和转换的过程。考虑以下场景:
```java
if (shape instanceof Circle) {
Circle circle = (Circle) shape;
double area = circle.calculateArea();
}
```
现在,通过模式匹配,您可以优雅地将其表达为:
```java
if (shape instanceof Circle circle) {
double area = circle.calculateArea();
}
```
另一个有趣的事情是,当 if 语句被否定时,变量作用域仍然适用于 else 子句。真聪明!
第二种是使用 switch 的模式匹配,其外观类似:
```java
Object data = "Hello, Java friends!";
switch (data) {
case String s -> System.out.println("String: " + s);
case Integer i -> System.out.println("Integer: " + i);
default -> System.out.println("Unknown data type");
}
```
这里,类型被匹配和转换,就像“instanceof”,但在 case 子句中。
记录
如今,我们在 Java 中很少看到新的关键字。虽然记录似乎与样板代码减少有关,但实际操作却并非如此。
记录旨在封装不可变数据,让开发人员免于繁琐的 getter、构造函数、equals 和 hashCode 样板。其紧凑的语法可轻松定义简单数据容器的蓝图,从而形成更简洁、更优雅的代码库。
考虑一个经典的场景,定义一个具有一些属性的 Person 类:
```java
public class Person {
private final String name;
private final int age;
// Constructor, getters, equals, hashCode...
}
```
有了记录,这就变成了一个简洁的声明:
```java
public record Person(String name, int age) {}
```
除了简洁之外,我们还获得了其他好处。我们不需要记住将字段标记为 final,这自然会使记录更加线程安全。由于我们不需要编写 hashCode 和 equals,因此我们不容易忘记实现其中一个。而且,记录的构造函数中可以包含的代码非常有限,这使得它们在序列化和反序列化时更加安全。
寻找即将到来的 IDE 支持来帮助您将现有的候选类转换为 Java 记录,并欣赏它们所带来的优雅性、正确性和安全性。
结论
Java 社区至关重要,致力于大规模解决相关工程问题。无数小时的研究投入到从性能和工艺方面提高 Java 的速度。采用框架和新语言功能可以预见地让您更快地投入生产(并让您晚上睡得更好)。
了解有关 Java 的更多信息
如果您渴望提升 Java 技能,Pluralsight 还提供各种适合您技能水平的 Java 和 Spring 相关课程。您可以注册10 天免费试用,无需承诺。您还可以进行同样免费的 roleIQ 评估,了解您当前的 Java 技能水平,并就如何弥补当前技能组合中的不足提供建议。
以下是 Pluralsight 学习路径列表,其中包含初级、中级和高级 Java 课程 — 只需选择适合您的起点即可。如果您不确定自己处于什么水平,每个页面都有一项技能评估可供您使用,它将推荐您应该从哪里开始。
如果您喜欢这篇文章,这里有一些我编写的课程供您查看。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~