Java 9の新しい特性の簡単な紹介

5581 ワード

1.Javaプラットフォームレベルモジュールシステム
Java 9の定義機能は、新しいモジュールシステムです.現代のコードライブラリはますます大きくなり、複雑に作成され、盤根が間違っている「スパゲッティコード」の確率は指数級に増加している.このとき,コードを真にカプセル化することは困難であり,システムは異なる部分(すなわちJARファイル)間の依存関係に明確な概念を持っていないという2つの基礎的な問題に直面しなければならない.各共通クラスは、クラスパスの下にある他の共通クラスにアクセスすることができ、公開されたくないAPIが何気なく使用されることになる.また、クラスパス自体にも問題があります.必要なJARがすべてあることをどのように知っていますか.あるいは、重複する項目があるのではないでしょうか.モジュールシステムはこの2つの問題をすべて解決した.
モジュール化されたJARファイルには、追加のモジュール記述器が含まれています.このモジュール記述器では、他のモジュールへの依存は「requires」によって表される.また、exports文は、他のモジュールによってアクセスできるパッケージを制御します.エクスポートされないすべてのパッケージは、デフォルトでモジュールにカプセル化されます.モジュール記述器の例は、module-info.javaファイルにあります.
module blog {
  exports com.pluralsight.blog;
 
  requires cms;
}

モジュールを以下に示すことができます.
両方のモジュールには、エクスポートされていないため、パッケージされたパッケージが含まれています(オレンジ色のシールドで可視化されています).これらのパッケージからのクラスを偶然使う人はいません.Javaプラットフォーム自体も独自のモジュールシステムを用いてモジュール化されている.JDKの内部クラスをカプセル化することで、プラットフォームがより安全になり、継続的な改善も容易になります.
モジュール化アプリケーションを開始すると、JVMはすべてのモジュールが使用できるかどうかを検証します.これは、脆弱なクラスパスよりも大きなステップを踏み出したrequires文に基づいています.モジュールを使用すると、アプリケーションを構造化してパッケージ化し、依存性を明確にすることができます.このコースでは、Java 9のモジュールの作業に関する詳細を学ぶことができます.
2. Linking
明示的な依存関係を持つモジュールとモジュール化されたJDKを使用すると,新しい可能性が現れた.あなたのアプリケーションモジュールは、他のアプリケーションモジュールへの依存と、使用するJDKモジュールへの依存を宣言します.これらの情報を使用して、アプリケーションを実行するために必要なモジュールだけを含む最小のランタイム環境を作成しないのはなぜですか?これはJava 9の新しいjlinkツールで実現できます.完全ロードJDKインストールバージョンを使用することなく、アプリケーションに最適化された最小ランタイムイメージを作成できます.
3.Jshell:インタラクティブJava REPL
多くの言語にはインタラクティブなプログラミング環境があり、Javaは現在このクラブに加入しています.コンソールからjshellを起動し、Javaコードの入力と実行を直接開始できます.jshellのインスタントフィードバックは、APIを探索し、言語特性を試みる良いツールになります.
Java正規表現をテストするのは、jshellがどのようにあなたの生活を楽にするかを説明する良い例です.インタラクティブshellは、教育環境の向上と生産性の向上にも役立ちます.詳細については、こちらをご覧ください.Javaの作成方法を教える過程で、「public static void main(String[]args)」というくだらない話を説明する必要はありません.
4.Javadocの改良
時には小さなことが大きな違いをもたらすことがあります.あなたは私のようにGoogleを使って正しいJavadocページを探していますか?これはもう必要ありません.Javadocは、APIドキュメントでの検索をサポートします.また、Javadocの出力は、互換HTML 5規格に準拠しています.さらに、各Javadocページには、JDKモジュールクラスまたはインタフェースのソースに関する情報が含まれていることに気づきます.
5.可変集合クラスと集合ファクトリメソッド
通常、リストやSetなどのコードにセットを作成し、直接いくつかの要素で埋め込みます.インスタンス化されたセット、いくつかの「add」呼び出しにより、コードが重複します.Java 9では、いくつかの集合ファクトリメソッドが追加されています.
Set ints = Set.of(1, 2, 3);
List strings = List.of("first", "second");

これらの方法は、より短く、よりよく読むことに加えて、特定のセット実装を選択することを回避することもできます.実際には,ファクトリメソッドから数要素を入れた集合実装を返すことが高度に最適化されている.これは、作成後に要素をこれらのセットに追加し続けると、「U n s p p p p p p o rtedOperationException」になるため、可変ではありません.
6.改善されたストリームストリームストリームAPI
長い間、Stream APIはJava標準ライブラリの最も良い改善の一つでした.このAPIによって、変換のための明示的なパイプをセット上に確立することができる.Java 9ではより良くなります.StreamインタフェースにはdropWhile,takeWhile,ofNullableの4つの新しいメソッドが追加されています.反復がいつ終了するかを指定するPredicate(判断条件)を提供するiterateメソッドの新しいリロードメソッドもあります.
IntStream.iterate(1, i -> i < 100, i -> i + 1).forEach(System.out::println);

2番目のパラメータはLambdaで、現在のIntStreamの要素が100に達したときにtrueを返します.したがって、この簡単な例は、1〜99をコンソールに印刷することである.
Stream自体の拡張に加えて、OptionalとStreamの結合も改善されました.Optionalの新しい方法stramによって、1つのOptionalオブジェクトを(空の)Streamオブジェクトに変換できるようになりました.
Stream s = Optional.of(1).stream();

複雑なStreamパイプラインを組み合わせる場合、OptionalをStreamに変換すると便利です.
7.プライベート・インタフェース・メソッド
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を開発する場合は、プライベートインタフェースメソッドがインプリメンテーションの構築に役立つ場合があります.
8. 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 resp = client.send(req, HttpResponse.BodyHandler.asString());
HttpResponse resp = client.send(req, HttpResponse.BodyHandler.asString());

この単純な要求/応答モデルに加えて、HttpClientは、ストリームおよびサービス側プッシュなどのHTTP/2の特性を処理するための新しいAPIを提供する.
9.マルチバージョン対応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クラスしか見られないからです.