## 概述
在本文中，我们将会对 Java 特性预览背后的动机进行一些探索，对比当前使用 Java 的版本提供了哪些实验性的功能，以及如何在不同的 IDE 工具中启用这个功能。

## 为什么使用特性预览
如你对 Java 版本的发行计划不太熟悉的话，那么需要了解的是 Java 目前是每 6 个月将会发行一个版本。在发行新的版本的时候会提供一些新的特性。

Java 特性预览这个功能，将能够让用户提前了解一些 Java 将会在新版本中使用的功能，同时也能让 Java 团队能够更多的获得用户的反馈意见。

我们都知道 Java 被在很多大中小系统中使用，哪怕是实现中的一点点瑕疵或者糟糕的糟糕的设计都会带来很多意想不到情况和损失。

又因 Java 系统的广泛应用，这种损失通常是非常巨大的。

如何能够确保每一个发行的 Java 版本能够稳定的发布和升级，同时也能够满足 Java 社区的需要就成了一个问题。

针对 JEP-12 的改进，Java 提供了针对 VM（虚拟机）和语言特性的预览功能。通过这种方式 Java 社区能够在环境中直接测试新的功能，同时这些功能也不会影响到服务器的开发和使用。

Java 团队会基于社区中的反馈而对预览的功能会进行一些调整，同时会针对后续的发行版本而对提供的新的特性进行多次修改。

在最后，新特性可能会成为官方正式的发布版本，当然提供的一些新特性可能会在后续的官方正式发布版本中被完全的删除。

## 预览一些实验性特性
Java 的预览特性是针对正在开发中的特性，并且这些特性还在接受评估。所以这些特性还没有完全确定，所以很多特性可能会在新的发行版本中出现，当然很多也可能会被完全抛弃。

正是因为 Java 对品质的要求，针对 JDK 的不版本的实现，都会要求在 JDK 发布的时候同时也包含有实验性的特性预览。但是，针对最后的发布版本，这种实验性的预览功能是不会提供的。

特性预览只是让 Java 社区提前知道 Java 团队目前正在干什么和计划要干什么的一种方式。需要明确的是，不要把这些可能还会删掉的特性和功能包含到你的发行版本中。

下面是 JEP-12 有关预览特性的定义，官方的链接地址在：https://openjdk.org/jeps/12。

如你有兴趣的话，可以直接阅读官方的原文。

## 使用预览特性
Java 预览特性在默认情况下是关闭的。为了启用这个功能，我们必须使用启用预览参数，使用这个参数将会把所有的特性一次性全部启用。

**Java 编译器（JVM）和 Java 的版本必须保持一致。**

让我们来尝试使用 JDK 13 中提供的 String 字符串块功能。
```
String query = """
    SELECT 'Hello World'
    FROM DUAL;
    """;
System.out.println(query);
```

上面的功能只能够在 JDK 13 及其后续版本中使用，所以为了使用这个功能，你需要安装 JDK 13 到你的计算机中。

### 使用 Eclipse
如果拷贝上面的代码到 Eclipse 中，你的 Eclipse 是不会进行进行正确编译的，在编译的过程中将会提示代码错误。

提示的内容是：如果需要这个功能请使用 JDK 13 的 String 字符串块功能。

这个时候，我们在我们的项目中单击右键，然后在弹出的菜单中选择属性。

然后进入到 Java 编辑器，这个时候我们就可以为我们的这个项目或者整个 Workspace 启用预览特性。

同时，我们还不能选择 使用默认编译器设置（Use default compliance settings）这个选项，这样可以让我们能够对 Java 13 的特性进行预览。

因目前我们使用的编译器版本比较高，为 JDK 17 的版本，所以在预览选项这里就只能对 JDK 21 的版本进行预览了。

![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/9/98cb0ad231736e2b16a915c49889b74c7c8440f3.png)

### IntelliJ IDEA
针对使用不同的 IDE，我们也希望我们的预览功能能够在 IDEA 中也可以使用。

与 Eclipse 相同，IDEA 也有这个方面的配置，你只需要在 IDEA 中修改配置即可。

配置是在语言结构上。

单击语言结构上的 SDK 默认，往下拉，就可以看到针对新版本的选项。

![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/3/3c64a3ccf02a1519a2516e36ab156fe02274819d.png)

同时还可以看到那些版本是支持新特性预览的，那些版本是不支持新特性预览的。

整体来说，IntelliJ IDEA 的新特性预览功能做得要比 Eclipse 更好一些。

### Maven
针对 Maven 项目，因 Maven 项目的配置都会依赖 pom.xml 来进行，对 IDE 的修改，可能在某些时候没有效果。

如果是这个情况的话，那你需要打开你的 pom.xml 文件，在 pom.xml 文件中找到针对编译有关的插件配置，然后再插件配置中添加 compilerArgs 参数。

具体的示例如下：

```
<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>
```
针对上面的修改，同样也能让你的 IDE 能够识别到。


### 使用命令行
在编译期间，Java 有 2 个参数来控制启用预览的功能，请参考下面的编译命令：

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

如果当前使用的 JDK 版本是不支持的预览功能的，那么使用上面的命令将会得到错误的提示。

例如 JDK 14 的版本是不支持预览的，在命令行中，如果我们把命令行的中的 13 替换成 14 的话，都那么编译器将会提示我们错误。

在实际的开发环境中，在命令行中使用预览功能的可能性非常小，设置我们都不会使用命令行的方式来编译我们的 Java 代码。

上面提出这种编译方式的目的就是告诉大家，我们还是有这个选项的，主要还是能够让大家了解我们是有这 2 个参数提供的。

在运行时，Java 只需要 enable-preview 参数就可以启用预览功能。

```
java --enable-preview ClassUsingTextBlocks
```

需要注意的是，在这里如果你的 JDK 版本和预览的版本不匹配的话，你的程序是没有办法运行的。

## 结论
在本篇文章中我们主要针对 Java 提供的特性预览功能进行了一些讨论。

在实际使用的时候，我们确实也会遇到一些，这些情况就是项目使用的 JDK 版本比较低，但是下载的 JDK 编译的 Jar 包版本又比较高，这就导致了无法编译的情况。

我们会考虑使用 Java 的预览功能来查看下代码的兼容性。

比如说，当前项目使用的 JDK 版本为 8，但是我们项目中的一个依赖却使用了 JDK 11 来编译了包，所以我们可能会把我们的编译器版本提升下到 JDK 11 来查看代码的兼容情况。


如你只是针对自己的项目的话，Java 新特性功能用得就比较少，主要是对架构师而言，他们需要确定下代码的兼容性，以便于在对 JDK 是否可以进行升级上做出判断。

---
https://www.isharkfly.com/t/java/15682
