Java 9 已经在 JavaOne 大会发布许久,本文将为我们梳理 Java 9 所具备的新功能。
JShell:交互式 Java REPL
很多编程语言都已经具有了交互式编程环境,如今 Java 也加入了这个具有REPL [读取、评估、打印、循环]功能的俱乐部。 交互式shell可以让你轻松完成 Java 类、接口、枚举、对象、语句等的测试任务。使用 JShell 进行测试时无需部署整个解决方案。JShell也就是Java Shell的缩写,可以在终端窗口执行JShell命令将其启动,然后就可以直接在命令行中输入并执行 java 代码了。
使用这个工具的最大好处之一是,我们可以轻松测试我们的微服务,而不需要一遍又一遍地部署它们。这有助于加速最终组件的开发、迭代和质量保证。
私有接口方法
Java 8为我们提供了接口中的默认和静态方法实现,但是,我们无法在接口中创建私有方法。如果接口中有多个默认方法包含相同功能,通常,我们会重构这些方法,调用一个可复用的私有方法。在Java 8中,你可以在接口中创建私有方法。随着 Java 9的发布,这个问题得以解决,现在我们可以向接口添加私有辅助方法来解决这种类型的问题。
public interface MyInterface {
default void interfaceDefaultMethod() { init(); }
default void interfaceSecondDefaultMethod() { init(); }
// This is the declaration of the Private Method in Interface
private void init() { ... }
}
Java 9 模块系统
Java 9最大的变化之一是引入了模块系统(Jigsaw 项目)。一直到 Java 8 版本,我们都在使用 Monolithic Jars 来设计基于 Java 语言的应用程序。这种设计有两个主要的基本问题:难以封装代码,并且系统不同部分之间缺乏明确依赖的概念。为了避免这些根本问题,Java 9 引入了模块系统。模块系统主要有如下好处:
JDK、JRE、JAR等被分割成更小的模块,我们可以只使用我们需要的模块即可。这有助于缩小小型设备应用程序的尺寸。
对封装提供强力支持。
内部 Non-Critical API 被隐藏,因为模块安全地隐藏了不需要的内部细节。这大大提高了应用程序的安全性。
改进的 Javadoc
我们一直以来都使用 Google 来搜索问题,才能找到正确的 Javadoc 页面。使用 Java 9这个问题得以解决,Javadoc 现在支持在 API 文档中的进行搜索。
HTTP/2客户端
Java 9 中有新的 HTTP/2 客户端 API 来处理 HTTP 调用。它代替了老旧的 `HttpURLConnection` API,并提供对 WebSocket 和 HTTP/2 的支持。
HttpClient newHttpClient = HttpClient.newHttpClient();
Uri uriObject = Uri.create("https://developersjournal.in");
HttpRequest request = HttpRequest.newBuilder(uriObject)
.header("User-Agent", "DJ")
.GET()
.build();
HttpResponse resp = client.send(req, HttpResponse.BodyHandler.asString());
新版字符串
Java 9 提供简化版的字符串格式,有助于清楚区分主要、次要、安全和补丁更新版本。
新版本的字符串格式符合当前的行业惯例,特别是语义版本控制(Server)。格式如下:
$MAJOR.$MINOR.$SECURITY.$PATCH
$MAJOR是主要版本增加的版本号,例如 JDK 9,其中包含由 Java SE 平台规范指定的重要新功能。主要版本包含新功能和对现有功能的更改,这些功能将提前计划和公布。
$MINOR是为每个次要更新增加的版本号,例如错误修复,标准 API 的修订,或相关平台规范范围之外的功能实现。
$SECURITY是针对安全更新版本增加的版本号,其中包含关键修复程序,包括提高安全性所需的修补程序。
$PATCH是包含已经一起测试的安全性和高优先级客户修补程序的版本的版本号。
多版本兼容 JAR
Java 9 扩展了 JAR 文件格式,以便在单个存档中共享多个 Java 版本的类文件。
多版本 JAR(MRJAR)包含针对特定 Java 平台版本的类和资源的附加版本目录。使用 jar 工具 --release 选项指定版本化目录。
改进的 Stream API
改进的 Stream API 允许对对象序列化数据的传入流进行过滤,以提高安全性和鲁棒性。
对象序列化客户端可以更容易地验证其输入,并且导出的远程方法调用(RMI)对象也可以更容易地验证调用参数。
序列化客户端实现了在 ObjectInputStream 上设置的过滤器接口。对于 RMI,通过RemoteServerRef 导出对象,该 RemoteServerRef 将 MarshalInputStream 上的过滤器设置为在未调用时验证调用参数。