JDK Projects 备忘录

他们开始建造城和塔。他们用火烧砖,把砖当石头来用。他们又拿石漆当灰泥,石漆来自海水和希纳尔的泉水。他们用了四十三年的时间来建城和造塔。塔的宽度有 203 块砖。每块砖的长度是高度的三倍。塔的高度是 5433 腕尺又 2 掌。〔塔的墙〕长十三斯塔德。

整理了一下 JDK 的各个 project,作为一个简单的导航

NOTE

在评论项目和挑选相关 JEP 的时候有极强的个人偏好,不作为评判的唯一标准

Project Amber

  • 项目网页:https://openjdk.org/projects/amber/
  • 项目目的:
    • 探索和孵化那些已被 OpenJDK JEP 流程接受为候选 JEP 的、更小型的、以提高生产力为导向的 Java 语言特性

该项目主要用于接受能够提高 Java 开发体验的 JEP,在最近几年影响较大的 JEP 包含如下

  • 513:灵活的构造函数体
    • 可以在构造器中更加灵活的编写代码。
    • 在此 JEP 合并之前,不可以在调用 this 或者 super 之前编写语句
  • 441:switch 的模式匹配
    • 在此 JEP 合并之前,不可以在 switch 中对类型进行匹配
    • 在此 JEP 合并之前,在 switch 中进行条件判断非常复杂
  • 361:switch 表达式
    • 在此 JEP 合并之后,可以在 switch 中编写具有返回值的语句

Project Babylon

  • 项目网页:https://openjdk.org/projects/babylon/
  • 项目目的:
    • 将 Java 的应用范围扩展到其他编程模型,例如 SQL、可微分编程、机器学习模型以及 GPU。
    • 巴比伦将通过增强 Java 的反射编程能力来实现这一目标,这种增强被称为代码反射。

暂时没有用过 XD。现在对于这个东西的直观感受是很能提高 Minecraft 的运行体验

Project Valhalla

  • 项目网页:https://openjdk.org/projects/valhalla/
  • 项目目的:
    • 通过值对象增强 Java 对象模型,将面向对象编程的抽象性与简单原始类型的性能特征相结合
    • ↑ 好简单粗暴但是巨恐怖的话啊

可以说这是 Java 和 JVM 的一次脱胎换骨,提供了值对象/值类型来进一步强化 JVM 的性能表现和开发体验。其带来的改进不是一点半点的,除了字面意的试图引入值对象和值类型,作为其基础工作还需要引入不可空类型。

而不可空类型的重要性不言而喻,相当于引入了 Rust 等语言的「引用永远不为空」理念

个人感觉如下的 JEP 将会对 Java/JVM 引来质变

  • JEP 草案:空值限制与可空类型(预览版)
    • 增强 Java 的引用类型,使程序员能够表达 null 引用是否被预期为该类型的值
    • 支持在不同空值属性类型之间进行转换,同时提供关于可能不当处理 null 值的警告
    • 与传统 Java 代码兼容互操作,这些代码未对其类型的 null 兼容性做出断言,并支持逐步采用这些新特性,而不会引入源代码或二进制不兼容性
    • 确保拒绝 null 值的类型变量在首次读取前完成初始化
    • 在运行时强制执行拒绝 null 值的类型,即使类被单独编译
    • 为运行时优化(例如值对象的扁平化)提供必要的元数据与完整性保证,使其能够依赖那些声称排除 null 的类型
  • JEP 218:原始类型泛型
    • 扩展泛型类型以支持泛型类和接口在基本类型上的特化。
    • 该 JEP 旨在实现基于原始类型或者结构体的特化泛型,具体行为表现如 C# 一般按需特化,为泛型类型填充为具体的类型
      • 该行为更简单的理解是从 Java 现在的”伪”泛型、类型擦除走向”真”泛型

Project Loom

  • 项目网页:https://wiki.openjdk.org/display/loom/Main
  • 项目目的:旨在探索、孵化和交付基于 Java 虚拟机特性的 API,以支持 Java 平台上易于使用、高吞吐量的轻量级并发和新的编程模型。

NOTE

很高兴的是 Project Loom 终于进入了人们的视野,新的项目已经开始利用虚拟线程来提高平台吞吐量。

并且得益于其优秀的设计,代码更改量非常少。

  • 425:虚拟线程(预览版)
    • 为 Java 平台引入虚拟线程 。虚拟线程是一种轻量级线程,能显著降低编写、维护和观察高吞吐量并发应用程序的工作量。
    • 使采用简单的一请求一线程风格编写的服务器应用程序能够以接近最优的硬件利用率进行扩展。
    • 使使用 java.lang.Thread API 的现有代码能够以最小的改动采用虚拟线程。
    • 使现有的 JDK 工具能够轻松地对虚拟线程进行故障排除、调试和分析。
  • 428:结构化并发(孵化器)
    • 通过引入结构化并发 API 来简化多线程编程。结构化并发将运行在不同线程中的多个任务视为一个工作单元,从而简化错误处理和取消操作,提高可靠性,并增强可观测性。
    • 提升多线程代码的可维护性、可靠性和可观测性。
    • 推广一种并发编程风格,能够消除因取消和关闭操作引发的常见风险,例如线程泄漏和取消延迟。

结构化并发很接近于 Golang 的 context,如果不熟悉的话可以粗略的看一眼 Golang 的 context 包功能和提供的方法。