1. 概述

本文将深入探讨 Java 预览特性(Preview Features)的设计初衷,它与实验性特性(Experimental Features)的本质区别,并手把手教你如何在主流开发工具中启用和使用这些特性。

2. 为什么需要预览特性

众所周知,Java 现在每六个月发布一个新版本。这意味着开发者能更快用上新功能,但同时也带来了新问题:留给社区对新功能反馈和调整的时间被大大压缩了。

别忘了,Java 是支撑着海量生产系统的语言。任何一个设计缺陷或实现 Bug,都可能造成巨大损失。因此,必须有一种机制,既能快速迭代新功能,又能确保其稳定性和实用性。

为了解决这个矛盾,JEP-12 提出了“预览特性”机制。新功能可以先以“预览”形式发布,让社区在真实场景中试用(当然不建议上生产)。

根据社区反馈,预览特性可以在后续多个版本中反复迭代优化。最终,它可能被正式采纳为永久特性;也可能因为反响不佳,被彻底移除。

核心目的:通过“发布 -> 试用 -> 反馈 -> 优化”的闭环,确保新特性足够成熟、符合开发者需求。

3. 预览特性 vs 实验性特性

这两者经常被混淆,但它们有本质区别,不能混为一谈。

预览特性(Preview Features)

  • 完全实现:设计、规范、实现均已完备。
  • 高质量要求:所有 JDK 发行版(如 Oracle JDK、OpenJDK、Azul Zulu 等)都必须包含同一版本的预览特性。
  • ⚠️ 非永久性:虽然实现完整,但尚未最终定稿,API 可能在后续版本中调整。
  • 目标明确:为了收集真实反馈,决定其最终命运(保留、修改或废弃)。

JEP-12 定义:预览语言或 VM 特性是指设计、规范和实现都已完成的新特性,但需要经过一段时间的广泛暴露和评估,才能决定其在 Java SE 平台中的最终地位——是成为永久特性,还是被进一步完善或移除。

实验性特性(Experimental Features)

  • 未完成:功能尚在早期探索阶段,远未达到可用状态。
  • 不稳定:API 可能随时大改,甚至整体推翻。
  • 高风险:使用它们可能破坏语言稳定性。
  • 非强制:不同 JDK 发行版可以选择性地提供不同的实验性特性。

📌 一句话总结:预览特性是“已完工待验收的样板房”,实验性特性是“还在打地基的毛坯房”。

4. 如何使用预览特性

预览特性默认是关闭的。要启用它们,必须显式使用 --enable-preview 参数,且编译器和 JVM 必须使用包含该预览特性的同一版本 JDK

我们以 JDK 13 中的 文本块(Text Blocks) 为例:

String query = """
    SELECT 'Hello World'
    FROM DUAL;
    """;
System.out.println(query);

要运行这段代码,首先确保你的开发环境使用的是 JDK 13。

4.1 在 Eclipse 中启用

默认情况下,Eclipse 会报红,提示你需要启用预览特性才能使用文本块。

操作步骤如下:

  1. 右键项目 -> Properties
  2. 进入 Java Compiler
  3. 取消勾选 Use default compliance settings
  4. 勾选 Enable preview features for Java 13

Preview Features Eclipse

4.2 在 IntelliJ IDEA 中启用

IntelliJ 同样默认不启用预览特性。

操作路径:

  1. File -> Project Structure
  2. Project 设置中,将 Project language level 选择为 13 (Preview)

Preview Features IntelliJ IDEA

⚠️ 如果仍有编译错误,需要手动在构建工具中添加编译参数。例如 Maven 项目,在 pom.xml 中配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>13</source>
                <target>13</target>
                <compilerArgs>
                    --enable-preview
                </compilerArgs>
            </configuration>
        </plugin>
    </plugins>
</build>

其他 Maven 插件(如 Surefire)若需编译预览特性代码,也需类似配置。

4.3 命令行方式

命令行是最直接的方式,但也最容易踩坑。

编译时javac 需要两个关键参数:

javac --release 13 --enable-preview ClassUsingTextBlocks.java

📌 注意

  • --release 13 确保编译目标与当前 JDK 版本一致。
  • JDK 14 无法编译使用 JDK 13 预览特性的代码。每个 JDK 版本只能使用本版本的预览特性。

运行时java 命令只需启用预览:

java --enable-preview ClassUsingTextBlocks

简单粗暴总结

  • 编译:javac --release N --enable-preview
  • 运行:java --enable-preview
  • 其中 N 是你使用的 JDK 版本号。

5. 结语

本文系统性地介绍了 Java 预览特性的设计背景、与实验性特性的关键区别,以及在主流开发环境中的启用方式。

掌握预览特性,不仅能让你提前体验 Java 最新能力,更能参与到 Java 语言的演进过程中。毕竟,你的反馈,可能就决定了某个特性未来的生死。

建议在学习和测试环境中大胆尝试,但在生产环境中务必谨慎,除非该特性已被正式采纳。


原始标题:Java Preview Features

» 下一篇: Big Queue 介绍