Java 18新特性全解析:简单Web服务器、代码片段标注与UTF-8默认字符集

本文详细介绍了Java 18为开发者带来的重要新特性,包括新的简单Web服务器模块、改进的Javadoc代码片段标注方式、UTF-8默认字符集以及finalize()方法的移除准备等核心内容。

Java 18为开发者带来的新特性

作者:Shaaf’s blog 发布日期:2022年1月27日 原文发布于:Red Hat Developers

对于Java开发者来说,令人兴奋的消息是Java 18已于去年年底从主线分叉,并进入了Rampdown Phase Two阶段。本文重点介绍了开发者可以在即将发布的Java 18中期待的一些特性,包括新的简单Web服务器模块、更复杂的Javadoc标注方式,以及–finalization=disabled选项,该选项让你可以测试当未来版本中移除finalization时Java应用程序的行为。文章末尾提供了下载Java 18早期访问版本的位置。

Java的新简单Web服务器

Java 18将在jdk.httpserver模块中提供一个最小功能的Web服务器。它有一个用于访问的API,以及位于bin目录中的二进制文件,以防你希望从命令行运行服务器。

运行Web服务器的命令可以很简单:

1
$ jwebserver -b 0.0.0.0 -p 8000

注意: 有关jdk.httpserver模块的更多命令行选项和详细信息,请参阅JEP 408文档。

如果你想知道是否可以使用简单Web服务器API实现完整的生产级Web服务器,答案是否定的。该Web服务器绝对不适用于此用途。原因之一是它通过HTTP/1.1通信,不支持PUT请求,因此不支持动态内容。推荐将该Web服务器用于原型设计、测试和调试。以下是一个带注释的示例代码片段:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import java.net.InetSocketAddress;
import java.nio.file.Path;
import com.sun.net.httpserver.SimpleFileServer;
import static com.sun.net.httpserver.SimpleFileServer.OutputLevel;

public class App {
    public static void main( String[] args ){
        // 创建一个简单的文件服务器,给定套接字地址、路径和输出级别
        var server = SimpleFileServer.createFileServer(new InetSocketAddress(8000), Path.of("/home/java"), OutputLevel.VERBOSE);

        // 启动服务器
        server.start();

        // 友好的开始消息
        System.out.println( "We are getting started.. Hello World!" );
    }
}

Java API文档中的代码片段

在Java 18之前,开发者主要使用@code注解在Javadoc注释中插入代码示例。该技术有些受限,需要变通方法。例如,验证代码片段内部内容、实现语法高亮以及插入链接或转义字符一直很困难。

作为一种新方法,JEP 413提议使用@snippet标签。如JEP中所述,该标签“可用于声明内联片段(代码片段包含在标签本身内)和外部片段(代码片段从单独的源文件中读取)”。

以下是一个内联片段的示例:

1
2
3
4
5
6
7
8
/**
 * 以下代码展示了如何使用 {@code Optional.isPresent}:
 * {@snippet :
 * if (v.isPresent()) {
 *     System.out.println("v: " + v.get());
 * }
 * }
 */

代码位于大括号之间,其中开头大括号后跟@snippet标签。Javadoc工具现在还包含指定链接、高亮代码等选项。更多详细信息请参阅JEP 413。

默认UTF-8字符集

在之前的版本中,默认字符集是在Java运行时启动时确定的,并取决于用户的区域设置和默认编码。因此,在Windows上字符集是windows-1252,而在macOS上,除了POSIX C区域设置外,都是UTF-8。从Java 18开始,UTF-8将成为所有操作系统的默认字符集。

你可以通过将file.encoding设置为COMPAT来更改默认字符集;例如,通过运行java -Dfile.encoding=COMPAT。此设置将恢复为Java 17中的算法。

现在为移除finalize()做准备

如果你开发过Java应用程序,可能熟悉finalize()方法。自Java 9以来,建议不使用finalize(),而是使用try-with-resources语句或新的Cleaner API。JEP 421帮助开发者为最终移除finalization做准备。你可以使用–finalization=disabled选项运行应用程序,以查看在没有finalize()方法的情况下它的行为如何。看到这种演进真是太好了。作为开发者,这也是一个更仔细查看应用程序行为的机会。

注意: 最近的Inside Java播客节目讨论了finalization的问题以及Java 18中的预期。更多详细信息请参阅JEP 421的文档。

Java 18中的预览特性

在Java 18开发阶段包含的一些特性仍处于预览状态。这些包括Vector API(JEP 417),Gunnar Morling在此DevNation Tech Talk中讨论了它。外部函数和内存API(JEP 419)以及switch模式匹配(JEP 420)也仍处于预览状态。

下载Java 18的位置

要尝试Java 18,你可以从Eclipse Adoptium下载早期访问的Eclipse Temurin构建。Temurin是Adoptium的OpenJDK发行版的名称。

如果你正在使用当前版本的Java,并希望与Java 18的特性进行比较,我还强烈推荐Java Almanac。它包含一个列出Java 18中所有新特性和更改的页面。

结论

本文快速浏览了Java 18的一些亮点。请关注Red Hat Developer OpenJDK页面以获取更多Java 18更新。你也可以开始使用Red Hat构建的OpenJDK。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计