Java 10ガイド

Java 10ガイド

1. 前書き

Java SE 10の実装であるJDK 10は、2018年3月20日にリリースされました。

この記事では、JDK10で導入された新機能と変更点について説明します。

2. ローカル変数型推論

この機能に関する詳細な記事のリンクをたどってください。

3. 変更不可能なコレクション

Java 10の変更不可能なコレクションに関連するいくつかの変更があります。

3.1. copyOf()

java.util.Listjava.util.Map 、およびjava.util.Set eachは、新しい静的メソッドcopyOf(Collection)を取得しました。

指定されたCollection:の変更不可能なコピーを返します

@Test(expected = UnsupportedOperationException.class)
public void whenModifyCopyOfList_thenThrowsException() {
    List copyList = List.copyOf(someIntList);
    copyList.add(4);
}

このようなコレクションを変更しようとすると、java.lang.UnsupportedOperationExceptionruntime例外が発生します。

3.2. toUnmodifiable*()

java.util.stream.Collectors getは、Stream を変更不可能なListMap 、またはSetに収集するための追加のメソッドを取得します。

@Test(expected = UnsupportedOperationException.class)
public void whenModifyToUnmodifiableList_thenThrowsException() {
    List evenList = someIntList.stream()
      .filter(i -> i % 2 == 0)
      .collect(Collectors.toUnmodifiableList());
    evenList.add(4);
}

このようなコレクションを変更しようとすると、java.lang.UnsupportedOperationExceptionruntime例外が発生します。

4. Optional.orElseThrow()*

java.util.Optionaljava.util.OptionalDoublejava.util.OptionalInt、およびjava.util.OptionalLongeachは、引数をとらず、値が存在しない場合にNoSuchElementExceptionをスローする新しいメソッドorElseThrow()を取得しました。

@Test
public void whenListContainsInteger_OrElseThrowReturnsInteger() {
    Integer firstEven = someIntList.stream()
      .filter(i -> i % 2 == 0)
      .findFirst()
      .orElseThrow();
    is(firstEven).equals(Integer.valueOf(2));
}

これは、既存のget()メソッドと同義であり、現在は推奨される代替手段です。

5. パフォーマンスの向上

この機能に関する詳細な記事のリンクをたどってください。

6. コンテナの認識

JVMs are now aware of being run in a Docker container andは、オペレーティングシステム自体にクエリを実行する代わりに、コンテナ固有の構成を抽出します。これは、コンテナに割り当てられているCPUの数や合計メモリなどのデータに適用されます。

ただし、このサポートはLinuxベースのプラットフォームでのみ利用可能です。 この新しいサポートはデフォルトで有効になっており、JVMオプションを使用してコマンドラインで無効にできます。

-XX:-UseContainerSupport

また、この変更により、JVMが使用するCPUの数を指定する機能を提供するJVMオプションが追加されます。

-XX:ActiveProcessorCount=count

また、DockerコンテナユーザーがJavaヒープに使用されるシステムメモリの量をよりきめ細かく制御できるように、3つの新しいJVMオプションが追加されました。

-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage

7. ルート証明書

cacertsキーストアは、当初は空でしたが、さまざまなセキュリティプロトコルで使用される証明書チェーンで信頼を確立するために使用できるルート証明書のセットを含めることを目的としています。

その結果、TLSなどの重要なセキュリティコンポーネントは、OpenJDKビルドではデフォルトで機能しませんでした。

OpenJDKビルドを開発者にとってより魅力的なものにし、それらのビルドとOracle JDKビルドの違いを減らすために、OracleのJava SEルートCAプログラムのWith Java 10, Oracle has open-sourced the root certificates を使用します。

8. 非推奨と削除

8.1. コマンドラインオプションとツール

ツールjavah は、ネイティブメソッドの実装に必要なCヘッダーとソースファイルを生成するJava 10から削除されました。現在、代わりにjavac -h を使用できます。

policytool は、ポリシーファイルの作成と管理のためのUIベースのツールでした。 これは現在削除されています。 ユーザーは、この操作を実行するために単純なテキストエディターを使用できます。

java -Xprofoptionを削除しました。 このオプションは、実行中のプログラムをプロファイルし、プロファイリングデータを標準出力に送信するために使用されました。 ユーザーは代わりにjmap toolを使用する必要があります。

8.2. APIs

非推奨のjava.security.aclパッケージはforRemoval = trueとマークされており、Java SEの将来のバージョンで削除される可能性があります。 java.security.Policy および関連するクラスに置き換えられました。

同様に、java.security。\ {Certificate、Identity、IdentityScope、Signer} APIはforRemoval=trueとしてマークされます。

9. 時間ベースのリリースバージョン管理

Java 10以降、OracleはJavaの時間ベースのリリースに移行しました。 これには次の意味があります。

  1. A new Java release every six months. 2018年3月のリリースはJDK10、2018年9月のリリースはJDK11などです。 これらは機能リリースと呼ばれ、少なくとも1つまたは2つの重要な機能を含むことが期待されています

  2. Support for the feature release will last only for six months、つまり次の機能リリースまで

  3. 長期サポートリリースはLTSとしてマークされます。 このようなリリースのサポートは3年間です

  4. Java 11はLTSリリースになります

java -version will now contain the GA date。リリースの古さを簡単に識別できます。

$ java -version
openjdk version "10" 2018-03-20
OpenJDK Runtime Environment 18.3 (build 10+46)
OpenJDK 64-Bit Server VM 18.3 (build 10+46, mixed mode)

10. 結論

この記事では、Java 10によってもたらされた新機能と変更を見ました。

いつものように、コードスニペットはover on GitHubにあります。