Java 9 vs Java 8:引入模块化和JShell的全面升级

156 阅读6分钟

Java 9 是 Java 语言的一个重大版本升级,带来了许多新的特性和改进。

在本篇博客中,我将为您介绍 Java 9 的一些重要特性。

🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

一、模块化

Java 9 的最大变化是模块化。在 Java 9 之前,Java 应用程序只能以 jar 文件的形式发布和部署。这意味着应用程序中的所有类和依赖项都被打包在一个文件中。这种方式在应用程序变得越来越庞大和复杂时变得不太可行。

Java 9 引入了模块化系统,使应用程序能够分解为更小、更可维护的部分。这些部分称为模块,每个模块都具有自己的命名空间,可以指定其导出和使用的包。这样一来,开发人员就可以更好地控制应用程序的组织结构,减少类之间的冲突,并提高应用程序的安全性。

下面是一个简单的Java 9模块化示例代码:

模块module-info.java文件:

module mymodule {
    exports com.example.mymodule;
}

Java类文件:

package com.example.mymodule;

public class MyClass {
    public void sayHello() {
        System.out.println("Hello from mymodule!");
    }
}

在该示例中,模块名称为“mymodule”,并且将“com.example.mymodule”包导出以供其他模块使用。MyClass是该包中的一个类,它有一个简单的方法sayHello(),在其中打印一条简单的消息。这个示例可以通过使用javac编译器编译,并使用java命令执行来运行。

二、JShell

JShell 是 Java 9 中一个非常实用的新功能,它是一个交互式的 Java 编程环境。与传统的 Java 编辑器不同,JShell 可以让您在一个交互式窗口中直接输入和执行 Java 代码。这意味着您可以在 JShell 中立即尝试Java 代码片段,无需编写和编译整个程序。JShell 还提供了自动补全和错误提示等功能,使编写 Java 代码变得更加容易和高效。

例如,您可以在 JShell 中尝试以下代码片段:

int a = 10;
int b = 20;
int c = a + b;
System.out.println(c);

JShell 会立即执行这段代码,并输出结果 30。这使得您可以更快地尝试和测试 Java 代码,以及进行一些快速的实验和验证。

三、接口的私有方法

在 Java 9 中,接口可以定义私有方法。这意味着您可以在接口内部编写一些辅助方法,这些方法不会被接口的实现类继承或访问。这样一来,接口的实现类就可以更加清晰和简洁,而不必包含一些不必要的方法。

例如,您可以在接口中定义以下私有方法:

private static void printHello() {
    System.out.println("Hello");
}

这个私有方法只能在接口内部使用,不能在实现类中使用或继承。

四、改进的 try-with-resources

在 Java 9 中,try-with-resources 语句得到了改进。现在,您可以在 try-with-resources 语句中使用已经声明的资源,而不需要再次声明它们。这使得代码更加简洁和易读。

例如,您可以使用以下代码:

InputStream inputStream = new FileInputStream("file.txt");
try (inputStream) {
    // 处理输入流
} catch (IOException e) {
    // 处理异常
}

在这个例子中,inputStream 已经在外部声明,可以在 try-with-resources 语句中直接使用。

五、改进的 Streams API

Java 9 中还改进了 Streams API,使其更加强大和易用。其中一个改进是引入了三个新方法:takeWhile、dropWhile 和 ofNullable。

takeWhile 方法可以从流中获取满足某个条件的元素,直到不再满足条件为止。dropWhile 方法则可以丢弃满足某个条件的元素,直到不再满足条件为止。ofNullable 方法可以创建一个流,其中包含一个非空值或空流,具有更好的空值处理能力。

例如,您可以使用以下代码:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> evenNumbers = numbers.stream()
                                    .dropWhile(n -> n % 2 != 0)
                                    .collect(Collectors.toList());

在这个例子中,evenNumbers 包含了所有偶数,丢弃了第一个不是偶数的元素。

六、改进的 HttpClient API

Java 9 中还引入了一个新的 HttpClient API,以取代过时的 HttpURLConnection 和 Apache HttpClient。新的 HttpClient API 更加简单易用,支持HTTP/2 和 WebSocket,提供了更好的性能和可扩展性。它还提供了更丰富的功能,如对 HTTP 请求和响应的流处理、支持异步请求和响应等。

例如,您可以使用以下代码创建一个新的 HttpClient 实例并发出一个 GET 请求:

HttpClient httpClient = HttpClient.newHttpClient();
HttpRequest httpRequest = HttpRequest.newBuilder()
                                    .uri(URI.create("https://www.example.com"))
                                    .GET()
                                    .build();
HttpResponse<String> httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
System.out.println(httpResponse.body());

这个例子中,我们创建了一个新的 HttpClient 实例,然后使用 HttpRequest 构建器创建了一个 GET 请求。最后,我们使用 HttpClient 的 send 方法发出请求,并使用 HttpResponse.BodyHandlers.ofString() 指定响应的处理方式为字符串。最后,我们输出了响应体。

七、模块化系统

Java 9 中引入了一个全新的模块化系统,也称为 Java 平台模块系统(Java Platform Module System,JPMS)。模块化系统可以帮助开发人员更好地管理和组织代码,使其更加可维护、可扩展和可重用。

模块化系统将代码组织成模块,每个模块都有自己的名称、版本号和依赖关系。模块之间可以明确地指定依赖关系,使得代码更加清晰和可维护。

例如,您可以使用以下代码定义一个简单的模块:

module com.example.myapp {
    requires java.base;
    requires java.sql;
    exports com.example.myapp;
}

在这个例子中,我们定义了一个名为 com.example.myapp 的模块,该模块需要 java.base 和 java.sql 模块,同时导出了 com.example.myapp 包。

通过模块化系统,开发人员可以更好地管理依赖关系,减少代码冲突和重复,使代码更加可维护和可重用。

八、Java8和Java9的区别

特性Java 8Java 9
模块化不支持支持
接口私有方法不支持支持
Stream API改进无改进添加了一些新方法
改进的日期时间API支持支持
重复注解不支持支持
增强的类型推断不支持支持
try-with-resources改进不支持支持
多版本兼容JAR打包不支持支持
JShell REPL工具不支持支持
HTTP/2标准支持不支持支持
改进的性能一些改进一些改进

总结

Java 9 引入了许多新功能和改进,包括模块化系统、JShell、接口的私有方法、改进的 try-with-resources、改进的Streams API、改进的 HttpClient API 等。这些功能和改进使得 Java 9 更加强大、高效和易用,可以帮助开发人员更好地管理和组织代码,提高代码质量和可维护性。如果您还没有升级到 Java 9,那么现在是时候考虑了。