Ohhnews

分类导航

$ cd ..
Jetbrains Blog原文

IntelliJ IDEA 全面支持 Java 26 新特性

#java 26#intellij idea#开发工具#软件开发#jdk

Java 的发布周期意味着我们每六个月就会迎来一个新版本。Java 26 已于 2026 年 3 月 17 日正式发布。在 JetBrains,我们致力于在 IntelliJ IDEA 中支持最新技术,并为稳定版和预览版功能添加实用的增强功能。在本篇博文中,我们将概述 Java 26 带来的新特性,以及 IntelliJ IDEA 如何对其提供支持。

Java 26 包含了 10 个 JEP(JDK 增强提案),其中 5 个已正式定稿。虽然此版本没有引入新的稳定版语言特性,但带来了显著的性能提升和新的库功能。此外,多项预览功能也在持续成熟中。

我们也很高兴地分享,一位 JetBrains 的同事为 Java 平台贡献了一个虽小但非常实用的改进。

在深入探讨之前,让我们先配置 IntelliJ IDEA 以使用 Java 26。

在 IntelliJ IDEA 中使用 Java 26(设置指南)

IntelliJ IDEA 现已全面支持 Java 26。

要使用 Java 26,你需要下载 JDK。你可以直接在 IntelliJ IDEA 内部下载,也可以使用 SDKMAN! 等工具进行管理。

若要从 IntelliJ IDEA 内部下载 JDK,请打开 Project Structure(项目结构),转到 Project Settings | Project(项目设置 | 项目)选项卡,打开 SDK 字段的下拉菜单,然后选择 Download JDK(下载 JDK)。在弹出的 Download JDK 对话框中,将 Version(版本)设置为 26,并在 Vendor(供应商)字段中选择你想要使用的供应商。

请注意,你也可以在 IntelliJ IDEA 中下载早期访问(Early Access)版本。例如,Java 26 还引入了 Project Valhalla 的新构建版本,该版本也已开放下载。

[LOADING...]

正如《IntelliJ IDEA 2025.3 新特性》视频中所演示的,IntelliJ IDEA 已经支持了来自 Project Valhalla 的 value classesIntelliJ IDEA 2025.3 新特性 —— Java 26 Valhalla 早期访问值类型支持

如果你使用 SDKMAN!asdf 来管理 JDK,IntelliJ IDEA 可以读取项目中的 .sdkmanrc.tool-versions 文件,并在打开项目时自动配置 JDK。例如,如果你正在使用 SDKMAN! 且 .sdkmanrc 文件中指定的 JDK 版本尚未安装,文件中会出现一个内嵌提示,允许你通过运行相关的 SDKMAN! 命令直接从 IDE 进行下载。

[LOADING...]

如果 JDK 已安装但尚未为项目配置,则会出现 Set as project JDK(设置为项目 JDK)的内嵌提示。点击该提示即可为项目设置对应的 JDK 版本。设置完成后,会出现 Project JDK (26)(项目 JDK (26))的内嵌提示,点击链接即可打开设置了 SDK 的 Project Structure(项目结构)窗口。

确保配置 IntelliJ IDEA 使用正确的语言级别。要使用 Java 26 的稳定功能,请将 Language level(语言级别)设置为 26 -- No new language features(26 -- 无新语言特性)。正如前面提到的,Java 26 没有引入新的稳定版语言特性,因此采用了这一描述。

[LOADING...]

要尝试预览功能,请将 Language level(语言级别)设置为 26 (Preview) -- Primitive types in patterns (Fourth preview)(26 (预览) -- 模式中的基本类型(第四次预览))。设置正确的语言级别意味着 IntelliJ IDEA 将在编辑器中提供相应的支持,包括检查和快速修复。预览功能的使用会被突出显示,因为你可能暂时不想在生产代码中使用它们。

[LOADING...]

当你将语言级别设置为 Java 26(无论是稳定版还是预览版)时,IntelliJ IDEA 会显示所有相关的检查项。要查看 IntelliJ IDEA 最新版本中新增了哪些检查项,请打开 Settings | Editor | Inspections(设置 | 编辑器 | 检查),点击 Filter Inspections(过滤检查)按钮,然后选择 Show New Inspections in IDEA 2026.1(显示 IDEA 2026.1 中的新检查)。

完整的检查列表可在 Inspectopedia 上查看。在未来的 IntelliJ IDEA 版本中,我们将继续根据当前及新的语言特性,为 Java 语言支持添加更多检查项。

Java 26 的新稳定特性

让我们快速浏览一下 Java 26 引入的特性。

JEP 516:使用任意 GC 的预编译对象缓存

作为 Project Leyden 的一部分,Java 继续致力于提升启动时间和预热性能。JEP 516 扩展了 HotSpot JVM 的预编译(AOT)缓存,使其能够与任何垃圾回收器(包括低延迟的 ZGC)协同工作,通过以 GC 无关的格式存储缓存的 Java 对象,并在启动时按顺序加载到内存中。

JEP 517:HTTP Client API 的 HTTP/3 支持

更新了 Java 11 中引入的 HTTP Client API 以支持 HTTP/3 协议,使得库和应用程序只需极少的代码修改即可与 HTTP/3 服务器交互。这让使用 HTTP Client API 的应用程序能够受益于 HTTP/3 协议带来的改进,例如更快的握手、更可靠的传输以及避免网络拥塞问题。HTTP/3 协议目前已被大多数 Web 浏览器支持,且覆盖了近 40% 的网站。

JEP 522:G1 GC:通过减少同步提高吞吐量

此 JEP 通过减少应用程序线程与 GC 线程之间所需的同步,提升了使用 G1 垃圾回收器的应用程序的吞吐量。

JEP 500:准备让 final 真正意味着不可变

JDK 26 在使用深度反射(Deep Reflection)修改 final 字段时会发出警告。此举旨在为未来的版本做准备,届时 final 将真正意味着不可变,从而使 Java 程序更安全、运行更快。依赖此模式的应用程序可以提前更新代码,或在确实需要的地方选择性地重新启用。

JEP 504:移除 Applet API

自 JDK 17 起已被弃用的 Applet API 已被正式移除。现代浏览器和近期的 JDK 版本均不再支持 Applet。

Java 26 的预览特性

随着 Java 六个月的发布周期,新语言特性通常会以预览功能的形式发布。这让开发者有机会在功能正式定稿前进行尝试并提供反馈。一个预览功能在成为语言标准部分之前,可能会经历多轮迭代(无论是否有改动)。

IntelliJ IDEA 致力于支持预览功能,让你能够在它们定稿前进行实验。由于这些功能的运作机制,IntelliJ IDEA 仅支持当前 JDK 的预览功能。要启用预览功能,请将 Language level(语言级别)设置为 26 (Preview) -- Primitive types in patterns (Fourth preview)

Java 26 包含 4 个预览功能和 1 个孵化功能。与 Java 25 相比,Java 26 中的预览功能有若干变动。

JEP 530:模式、instanceof 和 switch 中的基本类型(第四次预览)

此功能增强了模式匹配,使其支持在 instanceofswitch 等模式上下文中使用所有基本类型。该特性消除了模式匹配中现有的部分限制,使得在这些构造中匹配、测试和安全转换基本类型值成为可能。通过消除不安全的手动强制转换(可能导致细微的 Bug)和范围检查的需求,该功能提高了代码的安全性和可读性。此功能再次进入预览,并针对 Java 25 版本进行了一些调整,增加了一些约束(详情请参阅 JEP)。

JEP 526:惰性常量(第二次预览)

作为 Java 程序员,我们深知应追求不可变性,因为它带来了许多好处。由于不可变对象只能处于一种状态,因此可以安全地在多个线程间共享。目前管理不可变性的方式是声明 final 字段。然而,final 字段必须尽早设置(实例字段在构造时,静态字段在类初始化时)。这种初始化方式会导致启动时间变长,如果字段并未实际使用,这种开销甚至是不必要的。

惰性常量(Lazy Constants)在初始化时机上提供了更大的灵活性。顾名思义,它们是惰性初始化的。一个惰性常量是一个持有单个不可变值的 java.lang.LazyConstant 对象,该值仅在首次需要时才设置。JVM 将其视为真正的常量,并应用相同的性能优化。

为了符合常量折叠(在编译时简化常量表达式的过程)的条件,惰性常量必须存储在 final 字段中。IntelliJ IDEA 2026.1 添加了一项检查和快速修复,用于将 LazyConstant 声明为 final

[LOADING...]

与 Java 25 相比,该功能有一些变化,主要集中在高级用例上,移除了底层方法,并相应地重命名了该功能——从“稳定值”(stable values)更名为“惰性常量”(lazy constants)。

JEP 525:结构化并发(第六次预览)

结构化并发为多线程代码提供了更好的“惯用法”,体现了同步思维方式。这使得并发代码更易于理解和推理。此外,它有助于消除线程泄漏和取消延迟。它将一组在不同线程中运行的相关任务视为一个单一的工作单元,从而提高了并发代码的可观测性、取消机制和错误处理能力。

IntelliJ IDEA 提供了一个实时模板 sts,用于在代码中添加结构化并发。如果你知道实时模板的存在,可以直接通过名称调用它。

IntelliJ IDEA 2026.1 在调试器中针对虚拟线程进行了一些改进。虚拟线程被归类到代表其作用域的容器中,这使得区分虚拟线程和平台线程变得非常容易。任何没有自己容器的虚拟线程都会被放置在 Root 容器下。这种分组是全新的,为你提供了结构化并发中清晰的结构视图。

JEP 524:加密对象的 PEM 编码(第二次预览)

此 JEP 提供了一个预览 API,用于将加密对象编码/解码为隐私增强邮件(PEM)格式。第二个预览版本相比前一版本包含了一些变动。

Java 26 的孵化功能

孵化功能是提供给开发者尝试并反馈的实验性 API。与预览功能不同,孵化 API 在未来版本中可能会发生重大变化甚至被移除,因此不建议用于生产环境。

要使用孵化功能,你需要在运行时显式添加模块。例如使用 Vector API,需添加:--add-modules jdk.incubator.vector

如果你在 IntelliJ IDEA 中运行程序,可以将其添加到应用程序的运行配置中。选择程序的运行配置,点击 More Actions(更多操作)的三个点,选择 Edit...(编辑)以打开 Run/Debug Configurations(运行/调试配置)。点击 Modify Options(修改选项)链接,在 Add Run Options(添加运行选项)弹出窗口中选择 Add VM Options(添加虚拟机选项)。一个新的字段将出现,提示为 VM Options。在该字段中添加 --add-modules jdk.incubator.vector 即可。

JEP 529:Vector API(第十一次孵化)

此 JEP 引入了一个 API,允许开发者编写向量计算,并可靠地编译为受支持 CPU 上的最优向量指令。向量操作使单 CPU 周期内能执行更多工作,从而带来显著的性能提升。

第十一次孵化版本与上一版本相比没有实质性变化。Vector API 将继续孵化,直到 Project Valhalla 的必要功能就绪,届时它将被适配并提升为预览状态。

对 Java 平台的贡献

当我们发现能够让 Java 更安全或减少出错机会的机会时,我们当然会尝试在 IntelliJ IDEA 中提供有用的功能来帮助你编写更好的代码。但同时,我们也积极向平台回馈改进。

我们的同事 Tagir Valeev(《100 Java Mistakes and How to Avoid Them》一书的作者)贡献了两个新的 java.util.Comparator 默认方法:min(T, T)max(T, T)。这些方法使得使用给定的比较器查找两个对象中的较小值或较大值变得非常直接,无需冗长的变通方案。你可以在 JDK-8356995 中找到更多详细信息。我们很高兴看到这一变更被平台采纳!

结论

Java 26 虽然不是 LTS(长期支持)版本,但它带来了显著的性能改进、实用的库新增功能,并持续推进了多项重要的预览特性。IntelliJ IDEA 从第一天起就支持 Java 26,因此你可以立即开始利用此版本提供的所有新特性。

IntelliJ IDEA 将持续支持最新的 Java 特性。一如既往,欢迎随时向我们反馈你的意见。