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 会报红,提示你需要启用预览特性才能使用文本块。
操作步骤如下:
- 右键项目 ->
Properties
- 进入
Java Compiler
- 取消勾选 Use default compliance settings
- 勾选 Enable preview features for Java 13
4.2 在 IntelliJ IDEA 中启用
IntelliJ 同样默认不启用预览特性。
操作路径:
File
->Project Structure
- 在
Project
设置中,将Project language level
选择为13 (Preview)
⚠️ 如果仍有编译错误,需要手动在构建工具中添加编译参数。例如 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 语言的演进过程中。毕竟,你的反馈,可能就决定了某个特性未来的生死。
建议在学习和测试环境中大胆尝试,但在生产环境中务必谨慎,除非该特性已被正式采纳。