ホームページ > Java > &#&チュートリアル > Javaの9つの新機能を詳しく解説

Javaの9つの新機能を詳しく解説

Y2J
リリース: 2017-05-15 09:30:30
オリジナル
1404 人が閲覧しました

Java 8 のリリースから 3 年以上が経過し、2017 年 7 月の次のバージョンのリリース日が近づいています。 Java 9 のモジュール システムについて聞いたことがあるかもしれませんが、この新しいバージョンには他にも多くの更新があります。 ここでは、Java 9 に搭載される 9 つのエキサイティングな新機能を紹介します。必要な友達は参考にしてください。

この記事では主に Java 9 の 9 つの新機能を紹介します。これは誰にとっても参考になり、学習する価値があります。詳しくは、Java プラットフォーム レベル モジュール システム

を見てみましょう。 9 の特徴は新しいモジュール システムです。コード ベースが大きくなるにつれて、複雑で複雑な「スパゲッティ コード」が作成される可能性が飛躍的に増加します。現時点では、2 つの基本的な問題に直面する必要があります。それは、コードを真にカプセル化することが難しいこと、もう 1 つは、システムが異なる部分 (つまり、JAR ファイル) 間の依存関係について明確な概念を持っていないことです。すべてのパブリック クラスは、クラスパス内の他のパブリック クラスからアクセスできるため、パブリックにアクセスすることを意図していない API が誤って使用される可能性があります。さらに、クラスパス自体にも問題があります。必要な JAR がすべてすでに存在しているかどうか、または重複したエントリがあるかどうかをどのようにして知ることができるのでしょうか? モジュール システムは両方の問題を解決します。

Modular JAR ファイルには、追加のモジュール記述子が含まれています。このモジュール記述子では、他のモジュールへの依存関係が「requires」によって表現されます。さらに、「exports」ステートメントは、他のモジュールがどのパッケージにアクセスできるかを制御します。エクスポートされないパッケージはすべて、デフォルトでモジュールにカプセル化されます。以下は、「module-info.java」ファイルに存在するモジュール記述子の例です:

module blog {
 exports com.pluralsight.blog;

 requires cms;
}
ログイン後にコピー

モジュールは次のように表示できます:


注意してください:

両方のモジュールエクスポートされないため、カプセル化されたパッケージが含まれます (オレンジ色のシールドを使用して視覚化されます)。 これらのパッケージのクラスを誤って使用する人はいません。 Java プラットフォーム自体も、独自のモジュール システムを使用してモジュール化されています。 JDK の内部クラスをカプセル化することで、プラットフォームの安全性が高まり、継続的な改善が容易になります。 2. リンク

明示的な依存関係を持つモジュールとモジュール型 JDK を使用すると、新しい可能性が現れます。アプリケーション モジュールは、他のアプリケーション モジュールおよびそれが使用する JDK モジュールへの依存関係を宣言します。この情報を使用して、アプリケーションの実行に必要なモジュールのみを含む最小限のランタイム環境を作成してみてはいかがでしょうか。 これは、Java 9 の新しい jlink ツールを使用して可能になります。完全にロードされた JDK インストール バージョンを使用しなくても、アプリケーションに最適化された最小限のランタイム イメージを作成できます。

3. JShell: インタラクティブな Java REPL

多くの 多言語 にはすでにインタラクティブな プログラミング 環境があり、Java がそのクラブに加わりました。コンソールから jshell を起動し、Java コードの入力と実行を直接開始できます。 jshell は即時フィードバックを提供するため、API を探索したり、言語機能を試したりするための優れたツールになります。

Java 正規表現

のテストは、jshell がどのように作業を容易にするかについての良い例です。 インタラクティブ シェルは優れた教育環境を提供し、生産性を向上させることもできます。詳細については、こちらをご覧ください。 Java の書き方を人々に教える過程において、「public static void main(String [] args)」というナンセンスについて説明する必要はもうありません。

4. Javadoc の改善

小さなことが大きな違いを生むことがあります。あなたも私と同じで、Google を使って正しい Javadoc ページを見つけたことがあるでしょうか? これはもう必要ありません。 Javadoc は、API ドキュメント内で search をサポートするようになりました。さらに、Javadoc 出力は HTML5 標準に準拠するようになりました。さらに、すべての Javadoc ページに、JDK モジュール クラスまたは

インターフェース

のソースに関する情報が含まれていることに気づくでしょう。


五、集合工厂方法

通常,您希望在代码中创建一个集合(例如,ListSet ),并直接用一些元素填充它。 实例化集合,几个 “add” 调用,使得代码重复。 Java 9,添加了几种集合工厂方法:


Set<Integer> ints = Set.of(1, 2, 3);
List<String> strings = List.of("first", "second");
ログイン後にコピー

除了更短和更好阅读之外,这些方法也可以避免您选择特定的集合实现。 事实上,从工厂方法返回已放入数个元素的集合实现是高度优化的。这是可能的,因为它们是不可变的:在创建后,继续添加元素到这些集合会导致 “UnsupportedOperationException” 。

六、改进的 Stream API

长期以来,Stream API 都是 Java 标准库最好的改进之一。通过这套 API 可以在集合上建立用于转换的申明管道。在 Java 9 中它会变得更好。Stream 接口中添加了 4 个新的方法:dropWhile, takeWhile, ofNullable。还有个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代:


IntStream.iterate(1, i -> i < 100, i -> i + 1).forEach(System.out::println);
ログイン後にコピー

第二个参数是一个 Lambda,它会在当前 IntStream 中的元素到达 100 的时候返回 true。因此这个简单的示例是向控制台打印 1 到 99。

除了对 Stream 本身的扩展,Optional 和 Stream 之间的结合也得到了改进。现在可以通过 Optional 的新方法 `stram` 将一个 Optional 对象转换为一个(可能是空的) Stream 对象:


Stream<Integer> s = Optional.of(1).stream();
ログイン後にコピー

在组合复杂的 Stream 管道时,将 Optional 转换为 Stream 非常有用。

七、私有接口方法

Java 8 为我们带来了接口的默认方法。 接口现在也可以包含行为,而不仅仅是方法签名。 但是,如果在接口上有几个默认方法,代码几乎相同,会发生什么情况? 通常,您将重构这些方法,调用一个可复用的私有方法。 但默认方法不能是私有的。 将复用代码创建为一个默认方法不是一个解决方案,因为该辅助方法会成为公共API的一部分。 使用 Java 9,您可以向接口添加私有辅助方法来解决此问题:


public interface MyInterface {

  void normalInterfaceMethod();

  default void interfaceMethodWithDefault() { init(); }

  default void anotherDefaultMethod() { init(); }

  // This method is not part of the public API exposed by MyInterface
  private void init() { System.out.println("Initializing"); }
}
ログイン後にコピー

如果您使用默认方法开发 API ,那么私有接口方法可能有助于构建其实现。

八、HTTP/2

Java 9 中有新的方式来处理 HTTP 调用。这个迟到的特性用于代替老旧的 `HttpURLConnection` API,并提供对 WebSocket 和 HTTP/2 的支持。注意:新的 HttpClient API 在 Java 9 中以所谓的孵化器模块交付。也就是说,这套 API 不能保证 100% 完成。不过你可以在 Java 9 中开始使用这套 API:


HttpClient client = HttpClient.newHttpClient();

HttpRequest req =
  HttpRequest.newBuilder(URI.create("http://www.google.com"))
       .header("User-Agent","Java")
       .GET()
       .build();


HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandler.asString());
ログイン後にコピー

除了这个简单的请求/响应模型之外,HttpClient 还提供了新的 API 来处理 HTTP/2 的特性,比如流和服务端推送。

九、 多版本兼容 JAR

我们最后要来着重介绍的这个特性对于库的维护者而言是个特别好的消息。当一个新版本的 Java 出现的时候,你的库用户要花费数年时间才会切换到这个新的版本。这就意味着库得去向后兼容你想要支持的最老的 Java 版本 (许多情况下就是 Java 6 或者 7)。这实际上意味着未来的很长一段时间,你都不能在库中运用 Java 9 所提供的新特性。幸运的是,多版本兼容 JAR 功能能让你创建仅在特定版本的 Java 环境中运行库程序时选择使用的 class 版本:


multirelease.jar
├── META-INF
│  └── versions
│    └── 9
│      └── multirelease
│        └── Helper.class
├── multirelease
  ├── Helper.class
  └── Main.class
ログイン後にコピー

在上述场景中, multirelease.jar 可以在 Java 9 中使用, 不过 Helper 这个类使用的不是顶层的 multirelease.Helper 这个 class, 而是处在“META-INF/versions/9”下面的这个。这是特别为 Java 9 准备的 class 版本,可以运用 Java 9 所提供的特性和库。同时,在早期的 Java 诸版本中使用这个 JAR 也是能运行的,因为较老版本的 Java 只会看到顶层的这个 Helper 类。

如你所见,Java 9 提供了一大堆或大或小的功能特性,你准备好了么?

概要

【関連する推奨事項】

1. 特別な推奨事項: 「php Programmer Toolbox」V0.1バージョンのダウンロード

2. Javaの無料ビデオチュートリアル

3. Java アノテーションの数

以上がJavaの9つの新機能を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート