Java 11の機能

私たちはまだJava 10に完全に没頭していませんが、Java 11が登場しました。 Java 11にはいくつかの理由があるため、重要です。オラクルはサポートモデルを見直し、約6ヶ月ごとに急速なアップデートを提供するリリーストレインを導入しました。彼らはライセンスとサポートモデルを変更しました、つまり、Java 11のOracle JDKをダウンロードすると商用利用に有料になります。

それは今後Javaを支払う必要があることを意味しますか? いいえ。必ずしもそうではありません、商業用にOracle JDKをダウンロードして使用する場合を除いては。

: IntelliJ IDEA 2018.2.4 Community EditionはすでにJava 11をサポートしています。

1. Java 11がなぜ重要か?

Java 11はJava 8に続く2番目のLTSリリースです。 Java 11以降、Oracle JDKは商用利用のために無料ではありません。開発段階では使用できますが、商業的に使用するにはライセンスを購入する必要があります。そうしないと、いつでもオラクルから請求書が届くかもしれません! Java 10はダウンロードできる最後の無料のOracle JDKでした。 Oracleは2019年1月からJava 8のサポートを終了しました。追加のサポートのために支払う必要があります。引き続き使用することはできますが、パッチやセキュリティアップデートは受け取れません。

OracleはJava 11以降、任意の単一のJavaバージョンに対して無料の長期サポート(LTS)を提供しません。

Oracle JDKが無料ではなくなりましたが、常にOracleやAdoptOpenJDK、Azul、IBM、Red Hatなどの他のプロバイダーからOpenJDKビルドをダウンロードできます。個人的な意見としては、エンタープライズレベルの利用を求めてサポート料金を支払う意欲がない限り、必要に応じてOpenJDKを使用し、アップグレードしてください。

2. どのJDKビルドをダウンロードすべきか、それぞれの利点は何ですか?

Oracleは新バージョンを6か月ごとにリリースするリリーストレインを作成したため、Oracleの無料のOpenJDKを使用している場合、新バージョンがリリースされるとOracleは無料の更新を提供しなくなります。これは企業にとって適応するのが難しい場合があります。Oracleに商用サポートを支払い、次のLTSバージョンにのみ移行します。これにより、2026年までJava 11のすべての更新とサポートが提供されます。2022年にJava 17をダウンロードできます。サポートが終了した後も無料のJavaバージョンを維持します。ただし、セキュリティ更新は受け取れず、セキュリティ上の問題が発生する可能性があります。

OracleはJava 9およびJava 10に対して商用サポートや更新を提供しません。無料で使用するために他の代替ビルドを探す必要があります。

Java 11が持つ荷物を理解したので、開発者にとって重要なJava 11の機能を分析しましょう。いくつかの重要なJEPについても議論します。注:JavaFXは別のモジュールとして利用可能であり、Java JDKの6ヶ月ごとのリリースサイクルには結び付いていません。

3. Java 11の無料版をダウンロードする方法は?

このリンクから本番向けのOpenJDKバージョンをダウンロードできます。バイナリはtarまたはzip形式で提供されているため、解凍して環境変数を設定してJavaコンパイラとJavaコマンドを使用できます。

4. Java 11の機能

Java 11の重要な機能のいくつかは次のとおりです:

  • 単一のコマンドでJavaファイルを実行する
  • Stringクラスに新しいユーティリティメソッド
  • ラムダパラメータのためのローカル変数構文
  • ネストされたベースアクセス制御
  • JEP 321:HTTPクライアント
  • ファイルへの文字列の読み書き
  • JEP 328:フライトレコーダー

Java 11からJEPプロセスで導入された新機能について議論しましょう。

4.1) 単一のコマンドでJavaファイルを実行する

主な変更点の1つは、最初にjavacツールでJavaソースファイルをコンパイルする必要がなくなったことです。javaコマンドでファイルを直接実行し、暗黙的にコンパイルできます。この機能はJEP 330の下にあります。以下は、Java 11で導入されたJava Stringクラスの新しいメソッドの一部です:

4.2) Java String メソッド

isBlank() – このインスタンスメソッドはboolean値を返します。空の文字列と空白のみの文字列は空白として扱われます。

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        // ここにコードを記述してください!
        
        System.out.println(" ".isBlank()); //true
        
        String s = "Anupam";
        System.out.println(s.isBlank()); //false
        String s1 = "";
        System.out.println(s1.isBlank()); //true
    }
}

lines() – このメソッドは、行で分割されたすべての部分文字列のコレクションである文字列のストリームを返します。

import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) throws Exception {
        
        String str = "JD\nJD\nJD"; 
        System.out.println(str);
        System.out.println(str.lines().collect(Collectors.toList()));
    }
}

上記のコードの出力は: strip(), stripLeading(), stripTrailing() strip() – 文字列の先頭と末尾の両方から空白を削除します。

しかし、すでにtrim()があります。それではstrip()はなぜ必要なのですか? strip()は、trim()の「Unicode-aware」な進化です。 trim()が導入されたとき、Unicodeは進化していませんでした。今、新しいstrip()はすべての種類の空白を先頭および末尾から削除します(Unicodeが空白かどうかを調べるには、メソッドCharacter.isWhitespace(c)を確認してください)。

上記の3つのメソッドを使用した例を以下に示します:

public class Main {
    public static void main(String[] args) throws Exception {
        // ここにコードを入力してください!
        
        String str = " JD "; 
        System.out.print("Start");
        System.out.print(str.strip());
        System.out.println("End");
        
        System.out.print("Start");
        System.out.print(str.stripLeading());
        System.out.println("End");
        
        System.out.print("Start");
        System.out.print(str.stripTrailing());
        System.out.println("End");
    }
}

上記のコードからのコンソール出力は次のとおりです: repeat(int) repeatメソッドは、int形式のメソッドで指定された回数だけ文字列を繰り返します。

public class Main {
    public static void main(String[] args) throws Exception {
        // ここにコードを入力してください!
        
        String str = "=".repeat(2);
        System.out.println(str); //prints ==
    }
}

4.3) ラムダパラメータのためのローカル変数構文

JEP 323ラムダ パラメーターのローカル変数構文は、Java 11での唯一の言語機能のリリースです。Java 10では、ローカル変数型推論 が導入されました。したがって、変数の型を右辺から推論することができました – var list = new ArrayList<String>(); JEP 323 は、暗黙的に型付けされたラムダ式の形式パラメーターを宣言するために var を使用できるようにします。今は次のように定義できます:

(var s1, var s2) -> s1 + s2

これはJava 8でも可能でしたが、Java 10で削除されました。Java 11で統一性を保つために戻ってきました。しかし、ラムダ内で型を省略できるので、なぜこれが必要なのでしょうか? もし @Nullable のような注釈を適用する必要がある場合、型を定義しなければそれはできません。この機能の制限 – すべてのパラメーターに型 var を指定するか、しないかを指定する必要があります。以下のようなものはできません:

(var s1, s2) -> s1 + s2 //no skipping allowed
(var s1, String y) -> s1 + y //no mixing allowed

var s1 -> s1 //not allowed. Need parentheses if you use var in lambda.

4.4) ネストベースのアクセス制御

Java 11以前は、次のように可能でした:

public class Main {
 
    public void myPublic() {
    }
 
    private void myPrivate() {
    }
 
    class Nested {
 
        public void nestedPublic() {
            myPrivate();
        }
    }
}

上記のように、メインクラスのプライベートメソッドは上記のネストクラスからアクセスできました。しかし、Java リフレクションを使用すると、IllegalStateExceptionが発生します。

Method method = ob.getClass().getDeclaredMethod("myPrivate");
method.invoke(ob);

Java 11のネストされたアクセス制御は、リフレクションでこの懸念に対処します。 java.lang.Classは、リフレクションAPIで3つのメソッドを導入します:getNestHost()getNestMembers()、およびisNestmateOf()

4.5) JEP 309: 動的クラスファイル定数

Javaクラスファイル形式は、新しい定数プール形式CONSTANT_Dynamicをサポートするように拡張されました。このJEPの目標は、ユーザーが提供する動作をパラメーター化できる単一の新しい定数プール形式を作成することにより、新しい形式の実現可能なクラスファイル制約の開発のコストと混乱を削減することです。これによりパフォーマンスが向上します。

4.6) JEP 318: Epsilon: No-Op Garbage Collector

JVMのGCがメモリを割り当てて解放する責任があるのに対し、Epsilonはメモリの割り当てのみを行います。Epsilonは、以下のもののためにメモリを割り当てます:

  • パフォーマンステスト。
  • メモリ圧力テスト。
  • VMインターフェイステスト。
  • 非常に短寿命のジョブ。
  • ラストドロップレイテンシの改善。
  • ラストドロップスループットの改善。

今、Elipson はテスト環境にのみ適しています。本番環境では OutOfMemoryError を引き起こし、アプリケーションをクラッシュさせます。Elipson の利点はメモリ解放のオーバーヘッドがないことです。したがって、パフォーマンスの正確なテスト結果を提供し、それを停止するためにはもはや GC できなくなります。注意:これは実験的な機能です。

4.7) JEP 320: Java EE および CORBA モジュールの削除

これらのモジュールは既に Java 9 で廃止されていました。これらは完全に削除されました。次のパッケージが削除されました:java.xml.wsjava.xml.bindjava.activationjava.xml.ws.annotationjava.corbajava.transactionjava.se.eejdk.xml.wsjdk.xml.bind

4.8) JEP 328: フライトレコーダー

Flight Recorderは、以前はOracle JDKの商用アドオンとして使用されていましたが、Oracle JDK自体がもはや無料ではないため、オープンソース化されました。 JFRは、実行中のJavaアプリケーションから診断およびプロファイリングデータを収集するためのプロファイリングツールです。そのパフォーマンスオーバーヘッドは無視できるもので、通常1%未満です。したがって、本番アプリケーションで使用できます。

4.9)JEP 321:HTTPクライアント

Java 11は、Http Client APIを標準化しています。新しいAPIはHTTP/1.1とHTTP/2の両方をサポートしています。クライアントからのリクエストの送信およびサーバーからのレスポンスの受信の全体的なパフォーマンスを向上させるように設計されています。また、WebSocketsをネイティブでサポートしています。

4.10)ファイルへの文字列の読み取り/書き込み

Java 11では、文字列の読み取りと書き込みを便利にすることを目指しています。次のメソッドがファイルからの読み取りと書き込みのために導入されています:

  • readString()
  • writeString()

次のコードはこれの例を示しています

Path path = Files.writeString(Files.createTempFile("test", ".txt"), "This was posted on JD");
System.out.println(path);
String s = Files.readString(path);
System.out.println(s); //This was posted on JD

4.11) JEP 329: ChaCha20およびPoly1305暗号アルゴリズム

Java 11では、ChaCha20およびChaCha20-Poly1305の暗号実装が提供されます。これらのアルゴリズムはSunJCEプロバイダに実装されます。

4.12) JEP 315: Aarch64イントリンシックスの改善

既存の文字列および配列イントリンシックスの改善、およびAArch64プロセッサ上のjava.lang.Math sin、cos、およびlog関数用の新しいイントリンシックスの実装を行います。

4.13) JEP 333: ZGC: スケーラブルな低遅延ガベージコレクタ(実験的)

Java 11では、低遅延GCが導入されました。これは実験的な機能です。OracleがGCに重要性を付けているのを見るのは良いことです。

4.14) JEP 335: Nashorn JavaScriptエンジンの非推奨化

Nashorn JavaScriptスクリプトエンジンとAPIは非推奨となり、これにより後続のリリースで削除されることが示されています。

5. 結論

Java 11で提供される重要な機能と更新内容を見てきました。Java 12がリリースされる際にお会いしましょう。

Source:
https://www.digitalocean.com/community/tutorials/java-11-features