java15の新機能について話す

あなたはあなたがやりたいことを何でもすることができます、私はJava8を使います 

jdk15のインストールと新しいバージョンのideaのインストールは言うまでもなく、ここに2つのソフトウェアがあります。

リンク:https  ://pan.baidu.com/s/1hOb0CChSfYotFl3s3QL2yAパスワード:mp6a

インストールが完了したら、java -versionでバージョンをチェックして、環境が正しいことを確認します。

新しいバージョンのアイデアには、次のような追加の設定が必要です。

OK、環境はOKです。コーディングを開始します。

このリリースの主な機能は次のとおりです。 

Java 15は、インキュベーターモジュール、3つのプレビュー機能、2つの非推奨機能、2つの削除機能など、14の主要な機能拡張/変更をユーザーに提供します。 

http://openjdk.java.net/projects/jdk/15/ 

対応する中国の機能:(JEP:JDK拡張提案、JDK拡張提案、つまりJDK機能の追加と改善の提案。) 

  • JEP 339:EdDSAデジタル署名アルゴリズム 
  • JEP 360:封印されたクラス(プレビュー) 
  • JEP 371:隠しクラス 
  • JEP 372:NashornJavaScriptエンジンを削除します 
  • JEP 373:レガシーDatagramSocketAPIを再実装する 
  • JEP 374:バイアスロックを無効にする 
  • JEP 375:パターンマッチングのインスタンス(2番目のプレビュー) 
  • JEP 377:ZGC:スケーラブルな低遅延ガベージコレクター 
  • JEP 378:テキストブロック 
  • JEP 379:シェナンドア:低休止時間のガベージコレクター 
  • JEP 381:SolarisおよびSPARCポートを削除します 
  • JEP 383:外部メモリアクセスAPI(Second Incubation Edition) 
  • JEP 384:記録(2回目のプレビュー) 
  • JEP 385:RMIアクティベーションメカニズムの放棄 

総括する: 

  • ギャングスターは次の言葉を借ります:JDK15のまったく新しい特性はそれほどバラ色ではなく、主に以前のバージョンのプレビュー機能であり、テキストブロック、ZGCなどの機能が決定したので安全に使用できますアップ。 

上司がこの新機能はあまり目を引くものではないと言うのはなぜですか?今回の主な機能は次の6つです。

JEP 360:封印されたクラス(プレビュー)  (この概念は実際にはJava言語の最初のものではなく、他の言語は以前に言及されています)

JEP 371:隠しクラス                 (この概念は実際にはJava言語の最初のものではなく、他の言語は以前に言及されています)

JEP 375:パターンマッチングのインスタンス(2番目のプレビュー)、

JEP 384:記録(2回目のプレビュー)

JEP 377:ZGC:拡張可能な低レイテンシのガベージコレクター   (以前の機能は修正されています)

JEP 378:テキストブロック、    (以前の機能修正)

1. JEP 360:封印されたクラス(プレビュー)封印されたクラスとインターフェイス(プレビュー) 

        スーパークラスの使用を制限するために使用され、封印されたクラスとインターフェイスは、それらを継承または実装する可能性のある他のクラスまたはインターフェイスを制限します。

        特定の用途: 

        封印されたクラスまたはインターフェースを導入したため、これらのクラスまたはインターフェースでは、指定されたクラスまたはインターフェースのみを拡張および実装できます。 

        封印された修飾子を使用すると、クラスを封印されたクラスとして宣言できます。封印されたクラスは、予約されたキーワード許可を使用して、それを直接拡張できるクラスをリストします。サブカテゴリは、最終、封印解除、または封印することができます。 

        以前のコードはこのようなものでした。 

public class Person { } //人

class Teacher extends Person { }//教师

class Worker extends Person { }  //工人

class Student extends Person{ } //学生

ただし、Personクラスを、これら3つのクラスのみに継承され、他のクラスには継承されないように制限する必要があります。これを行う必要があります。

//添加sealed参数,permits后面跟上只能被继承的子类名称
public sealed class Person permits  Teacher, Worker, Student{ } //人

//子类可以被修饰为 final
final class Teacher extends Person { }//教师

//子类可以被修饰为 non-sealed,此时 Worker类就成了普通类,谁都可以继承它
non-sealed class Worker extends Person { }  //工人
//任何类都可以继承Worker
class AnyClass extends Worker{}

//子类可以被修饰为 sealed,同上
sealed class Student extends Person permits MiddleSchoolStudent,GraduateStudent{ } //学生


final class MiddleSchoolStudent extends Student { }  //中学生

final class GraduateStudent extends Student { }  //研究生

クラスの階層を制限できる非常に強力で実用的な機能。

2、JEP 371:隠しクラス(隠しクラス 

この提案では、標準APIを使用して、検出できず、ライフサイクルが制限されている非表示のクラスを定義します。これにより、JVM上のすべての言語の効率が向上します。JDKの内外のフレームワークは動的にクラスを生成でき、これらのクラスは非表示のクラスを定義できます。一般的に、JVMに基づく多くの言語には、クラスを動的に生成するメカニズムがあり、言語の柔軟性と効率を向上させることができます。 

  • 非表示のクラスは本質的にフレームワーク用に設計されており、実行時に内部クラスを生成します。 
  • 非表示のクラスには、リフレクションを介してのみアクセスでき、他のクラスのバイトコードから直接アクセスすることはできません。 
  • 非表示のクラスは、他のクラスとは独立してロードおよびアンロードできるため、フレームワークのメモリフットプリントを削減できます。 

隠しクラスとは何ですか? 

非表示クラスは、他のクラスのバイナリコードで直接使用できないクラスです。非表示クラスは、主に一部のフレームワークでランタイムクラスを生成するために使用されますが、これらのクラスは直接使用されるのではなく、リフレクションメカニズムを介して呼び出されます。 

たとえば、JDK8で導入されたラムダ式では、JVMはコンパイル時にラムダ式を特別なクラスに変換しませんが、実行時に対応するバイトコードから対応するクラスオブジェクトを動的に生成します。 

さらに、動的エージェントを使用すると、特定のクラスの新しい動的クラスを生成することもできます。 

  では、これらの動的に生成されたクラスにどのような特性が必要でしょうか? 

  1. 発見できない。 特定の静的クラスに対して動的に生成された動的クラスであるため、この動的に生成されたクラスを静的クラスの一部と見なしたいと考えています。したがって、静的クラス以外の他のメカニズムが検出されることは望ましくありません。 
  1. アクセス制御。 静的クラスにアクセスして制御すると同時に、動的に生成されたクラスも制御できることを願っています。 
  1. ライフサイクル。 動的に生成されたクラスのライフサイクルは一般に比較的短く、静的クラスのライフサイクルと一貫性を保つ必要はありません。 

APIサポート 

したがって、検出できず、ライフサイクルが制限されている非表示のクラスを定義するために、いくつかのAPIが必要です。これにより、すべてのJVMベースの言語実装の効率が向上します。 

といった: 

java.lang.reflect.Proxyは、隠しクラスをプロキシインターフェイスを実装するプロキシクラスとして定義できます。 

java.lang.invoke.StringConcatFactoryは、非表示のクラスを生成して、一定の接続メソッドを保存できます。 

java.lang.invoke.LambdaMetaFactoryは、閉じた変数にアクセスするラムダサブジェクトに対応するために非表示のネストメイトクラスを生成できます。 

通常のクラスはClassLoader :: defineClassを呼び出すことによって作成され、非表示のクラスはLookup :: defineHiddenClassを呼び出すことによって作成されます。これにより、JVMは、提供されたバイトから非表示クラスを派生させ、非表示クラスをリンクし、非表示クラスへのリフレクティブアクセスを提供するルックアップオブジェクトを返すことができます。呼び出し側プログラムは、返された検索オブジェクトを介して、非表示クラスのClassオブジェクトを取得できます。 

3、instanceof(2番目のプレビュー)instanceof自動マッチングパターンのパターンマッチング 

Java 14でプレビュー言語機能として導入されたinstanceofパターンマッチングは、変更なしでJava15の2番目のプレビューにあります。

この機能については、java14の新機能で説明しました。参照先:java14の新機能

古い書き方: 

// 先判断类型
if (obj instanceof String) { 
    // 然后转换 
    String s = (String) obj; 
    // 然后才能使用 
} 

新しい文言:(自動マッチングモード) 

if (obj instanceof String s) {
    // 如果类型匹配 直接使用 
} else { 
    // 如果类型不匹配则不能直接使用 
} 

第4に、 ZGC:スケーラブルな低遅延ガベージコレクター(本番)の  ZGC機能がプラスになりました 

低レベルの最適化を心配している友人は、これにもっと注意を払うことができます。詳細については、java14-ZGCの新機能の詳細をご覧ください。

ZGCは、Java 11によって導入された新しいガベージコレクターです(JDK9の後のデフォルトのガベージコレクターはG1です)。いくつかの実験段階を経て、ついに公式機能になりました。 

2018年以降、ZGCは、クラスの同時アンロード、未使用メモリの排除、クラスデータ共有のサポートから、NUMAの認識の向上まで、多くの改善を追加しました。さらに、最大ヒープサイズが4TBから16TBに増加しました。サポートされているプラ​​ットフォームには、Linux、Windows、MacOSが含まれます。 

ZGCは、再設計された同時ガベージコレクターであり、GCの一時停止時間を短縮することでパフォーマンス向上させます。 

ただし、これはデフォルトのGCを置き換えるものではなく、デフォルトのGCはG1のままです。以前は-XX:+ UnlockExperimentalVMOptions -XX:+ UseZGCを使用してZGCを有効にする必要がありましたが、必要なのは-XX:+ UseZGCだけです。近い将来、デフォルトのガベージコレクターになると思います。 

関連するパラメータは、ZAllocationSpikeTolerance、ZCollectionInterval、ZFragmentationLimit、ZMarkStackSpaceLimit、ZProactive、ZUncommit、ZUncommitDelayです。ZGC固有のJFRイベント(ZAllocationStall、ZPageAllocation、ZPageCacheFlush、ZRelocationSet、ZRelocationSetGroup、ZUncommit)も実験から製品に変更されます。

V. JEP 378 :テキストブロック機能が修正されました 

テキストブロックは、最初にプレビュー機能としてJDK 13に登場し、次にJDK 14で再度プレビューされ、最後にJDK 15で確認され、安心して使用できるようになりました。 

以前にjava14を書いたときに書いたことがありますが、主な意味は、sql、html、json、および記事を直接 "" "" ""にスローできることです。以前の形式を維持します。長さの最後に1つ余分にあることに注意してください。スペースが折り返されます。覗いてみて

package com.hermanwang.java1;

import org.junit.Test;

/**
 * @author hermanwang
 * @create 2020-10-24
 */
public class TextBlocksTest {
    @Test
    public void test1(){
        // 之前的写法
        String text1 = "The Sound of silence\n" +
                "Hello darkness, my old friend\n" +
                "I've come to talk with you again\n" +
                "Because a vision softly creeping\n" +
                "Left its seeds while I was sleeping\n" +
                "And the vision that was planted in my brain\n" +
                "Still remains\n" +
                "Within the sound of silence";

        System.out.println(text1);

        //jdk13中的新特性:
        String text2 = """
                The Sound of silence
                Hello darkness, my old friend
                I've come to talk with you again
                Because a vision softly creeping
                Left its seeds while I was sleeping
                And the vision that was planted in my brain
                Still remains
                Within the sound of silence\
                """;
        System.out.println();
        System.out.println(text2);

        System.out.println(text1.length());
        System.out.println(text2.length());
    }

    //html
    @Test
    public void test2(){
        String html1 = "<html lang=\"en\">\n" +
                "<head>\n" +
                "    <meta charset=\"UTF-8\">\n" +
                "    <title>java14新特性</title>\n" +
                "</head>\n" +
                "<body>\n" +
                "    <p>hello,atguigu</p>\n" +
                "</body>\n" +
                "</html>";
        //jdk13中的新特性:
        String html2 = """
                <html lang="en">
                <head>
                    <meta charset="UTF-8">
                    <title>java14新特性</title>
                </head>
                <body>
                    <p>hello,atguigu</p>
                </body>
                </html>
                """;
    }

    //json
    @Test
    public void test3() {
        //jdk13之前的写法
        String myJson = "{\n" +
                "    \"name\":\"Song Hongkang\",\n" +
                "     \"address\":\"www.atguigu.com\",\n" +
                "    \"email\":\"[email protected]\"\n" +
                "}";
        System.out.println(myJson);

        //jdk13的新特性
        String myJson1 = """
                {
                    "name":"Song Hongkang",
                     "address":"www.atguigu.com",
                    "email":"[email protected]"
                }""";
        System.out.println(myJson1);
    }

    //sql
    @Test
    public void test4(){
        String sql = "SELECT id,NAME,email\n" +
                "FROM customers\n" +
                "WHERE id > 4\n" +
                "ORDER BY email DESC";

        //jdk13新特性:
        String sql1 = """
                SELECT id,NAME,email
                FROM customers
                WHERE id > 4
                ORDER BY email DESC
                """;
    }
    //jdk14新特性
    @Test
    public void test5(){
        String sql1 = """
                SELECT id,NAME,email
                FROM customers
                WHERE id > 4
                ORDER BY email DESC
                """;
        System.out.println(sql1);

        // \:取消换行操作
        // \s:表示一个空格
        String sql2 = """
                SELECT id,NAME,email \
                FROM customers\s\
                WHERE id > 4 \
                ORDER BY email DESC\
                """;
        System.out.println(sql2);
        System.out.println(sql2.length());
    }
}

6. JEP 384 レコードクラス(プレビュー) 

Records Classは、2番目に表示されるプレビュー機能でもあります。JDK14にも表示されます。Recordを使用して定数クラスを作成する方が便利です。前後のコードの比較は次のとおりです。  

  • Recordを使用してクラスを宣言すると、クラスには自動的に次の機能があります。 
  • メンバー変数を取得する簡単な方法は、name()とpartner()の例として上記のコードを取り上げます。通常のゲッターの作成とは異なることに注意してください。 
  • 比較を実行するときにクラスのすべてのメンバー属性を比較するequalsメソッドの実装 
  • もちろん、等しいを書き換えるには、hashCodeを書き換える必要があります 
  • クラスのすべてのメンバープロパティを出力できるtoStringメソッド。 
  • コンストラクターは1つだけであることに注意してください。

古い書き方:

package com.hermanwang.java1;

import java.util.Objects;

public class Point {

        private final int x;
        private final int y;
        Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
        int x() {
            return x;
        }
        int y() {
            return y;
        }
        public boolean equals(Object o) {
            if (!(o instanceof Point))
                return false;
            Point other = (Point) o;
            return other.x == x && other.y == y;
        }

        public int hashCode() {
            return Objects.hash(x, y);
        }
        public String toString() {
            return String.format("Point[x=%d,y=%d]", x,y);
        }
}

新しい執筆: 

record Point(int x, int y) {} 

レコードの他の機能は次のとおりです。

package com.hermanwang.java1;

/**
 * @author hermanwang
 * @create 2020-10-24
 */
public record Customer(String name,Customer partner) {
    //还可以声明构造器、静态的变量、静态的方法、实例方法

    public Customer(String name){
        this(name,null);
    }

    public static String info;

    public static void show(){
        System.out.println("我是一个客户");
    }

    public void showName(){
        System.out.println("我的名字是:" + name());
    }

    //不可以在Record中定义实例变量
//    public int id;

}

//Record不可以声明为abstract的
//abstract record User(){}

//Record不可以显式的继承于其他类
//record User() extends Thread{}

さて、これまでのところ、主要な6つの新機能は完了しており、残りの8つはそれほど重要な新機能ではありません。

以下の特徴を理解してください。

7. JEP 339 Edwards-Curveデジタル署名アルゴリズムEdDSAデジタル署名アルゴリズム 

これは新機能です。 

エドワーズカーブデジタル署名アルゴリズム(EdDSA-エドワーズカーブデジタル署名アルゴリズム)、つまりエドワーズカーブデジタル署名アルゴリズムに基づいて新しく追加された暗号化署名。他の多くの暗号化ライブラリ(OpenSSLやBoringSSLなど)でサポートされています。 

JDKの既存の署名方式と比較して、EdDSAはセキュリティとパフォーマンスが高いため、大きな注目を集めています。OpenSSLやBoringSSLなどの暗号化ライブラリでサポートされており、ブロックチェーン分野でより多く使用されています。 

EdDSAは、JDKの既存の署名スキームの利点を備えた最新の楕円曲線スキームです。EdDSAはSunECプロバイダーでのみ実装されます。 

8、JEP 373:レガシーDatagramSocket APIを再実装します( DatagramSocket APIを再実装します) 

新しい計画は、レガシーソケットAPIを再実装するJEP353のフォローアップです。 

java.net.datagram.Socketおよびjava.net.MulticastSocketの現在の実装は、IPv6がまだ開発中であったときのJDK1.0までさかのぼることができます。したがって、現在のマルチキャストソケットの実装では、保守が難しいIPv4とIPv6の方法を調整しようとしています。 

  • java.net.datagramの基本的な実装を置き換えることにより、古いDatagramSocketAPIを再実装します。 
  • java.net.DatagramSocketとjava.net.MulticastSocketを、よりシンプルで最新の低レベルの実装に変更します。JDKの保守性と安定性を向上させます。 

java.net.datagram.Socketおよびjava.net.MulticastSocketAPIの基盤となる実装を、より単純で最新の実装に置き換えることにより、従来のDatagramSocketAPIを再実装します。 

新しい実装:1。デバッグと保守が簡単です。2。ProjectLoomで探索されている仮想スレッドと連携します。

9、JEP 374:バイアスロックの無効化と非推奨無効化はロックする傾向がある 

 デフォルトでは、バイアスロックは無効になっており、関連するすべてのコマンドラインオプションは非推奨になっています。目標は、バイアスロックのメンテナンスコストの高いレガシー同期最適化を引き続きサポートする必要があるかどうかを判断することです。HotSpot仮想マシンはこの最適化を使用して、非競合ロックのオーバーヘッドを削減します。一部のJavaアプリケーションでは、バイアスロックを無効にするとパフォーマンスが低下する場合がありますが、バイアスロックのパフォーマンスの向上は、通常、以前ほど明白ではありません。 

この機能は、デフォルトでバイアスロックを無効にし(-XX:+ UseBiasedLocking)、関連するすべてのコマンドライン選択(BiasedLockingStartupDelay、BiasedLockingBulkRebiasThreshold、BiasedLockingBulkRevokeThreshold、BiasedLockingDecayTime、UseOptoBiasInliningStatistics、PrintBiasedLockStatistics)とPrintBiasedLockStatisticsを破棄します。 

10. JEP 379:シェナンドア:低休止時間のガベージコレクター 

Shenandoahガベージコレクションアルゴリズムは、最終的に実験機能から製品機能に変更されました。これは、JDK 12から導入された収集アルゴリズムであり、実行中のJavaスレッドで同時に避難作業を行うことでGCの一時停止時間を短縮します。Shenandoahの一時停止時間は、スタックが200MBか200GBかに関係なく、ヒープサイズとは関係ありません。同じ一貫した一時停止時間があります。 

シェナンドアとZGCの関係をどのように説明しますか?類似点と相違点は次のとおりです。 

  • 類似点:パフォーマンスはほぼ同じと見なすことができます 
  • 違い:ZGCはOracleJDKです。ShenandoahはOpenJDKにのみ存在するため、使用するときはJDKのバージョンに注意する必要があります。 

Openメソッド:-XX:+ UseShenandoahGCコマンドラインパラメーターを使用して開きます。 

ShenandoahはJDK12で実験として導入され、JDK15でProductionになりました。以前は、-XX:+ UnlockExperimentalVMOptions -XX:+ UseShenandoahGCで有効にする必要がありましたが、有効にするには-XX:+ UseShenandoahGCのみが必要です。 

11. JEP 383:外国-メモリアクセスAPI 外部メモリアクセスAPI (インキュベーター版) 

目的は、JavaプログラムがJavaヒープの外部の外部メモリに安全かつ効果的にアクセスできるようにするAPIを導入することです。ネイティブ、永続的、管理されたヒープなど。 

IgniteやMapDBなど、外部メモリにアクセスするJavaプログラムは多数あります。APIは、ファイルをメモリにマッピングすることにより、ガベージコレクションに関連するコストと、プロセス間でメモリを共有し、メモリの内容をシリアル化および逆シリアル化することに関連する予測不可能性を回避するのに役立ちます。Java APIは現在、外部メモリにアクセスするための十分なソリューションを提供していません。しかし、新しい提案では、APIはJVMのセキュリティを損なうべきではありません。 

Foreign-Memory Access APIは、JDK14およびJDK15のSecond IncubatorでインキュベーションAPIとして導入され、改善されました。 

12. JEP 381 SolarisおよびSPARCポートを削除しますSolarisおよびSPARCポートを削除します 

Solaris / SPARC、Solaris / x64、およびLinux / SPARCポートのソースコードとビルドサポートが削除されました。これは、JDK 14で廃止としてマークされ、JDK15で正式に削除されました。開発中の多くのプロジェクトと機能(Valhalla、Loom、Panamaなど)では、CPUアーキテクチャとオペレーティングシステム固有のコードに適応するために大幅な変更が必要です。 

近年、SolarisとSPARCの両方がLinuxオペレーティングシステムとIntelプロセッサに置き換えられました。SolarisおよびSPARCポートのサポートを放棄することで、OpenJDKコミュニティの貢献者は新機能の開発を加速し、それによってプラットフォームを前進させることができます。 

十三、JEP 372 NashornJavaScriptエンジンを削除する  

Nashornは、JDKで提案されているスクリプト実行エンジンです。この機能は、2014年3月にリリースされたJDK8の新機能です。JDK11では廃止としてマークされており、JDK15は完全に削除されています。 

GraalVMはJDK11で置き換えられました。GraalVMは、Javaおよびその他のJavaバイトコードベースの言語をサポートするランタイムプラットフォームですが、JavaScript、Ruby、Python、LLVMなどの他の言語もサポートします。パフォーマンスはNashornの2倍以上です。 

JDK15は、Nashorn JavaScriptEngineとjjsコマンドラインツールを削除しました。具体的には、2つのモジュールjdk.scripting.nashornとjdk.scripting.nashorn.shellが削除されました。 

十四、JEP 385:削除のためのRMIアクティベーションの廃止 

RMIアクティベーションは非推奨としてマークされており、将来のバージョンで削除される予定です。RMIアクティベーションメカニズムはRMIの廃止された部分であり、Java 8以降、必須ではなくオプションになっています。RMIアクティベーションメカニズムは、継続的なメンテナンスの負担を増大させます。RMIの他の部分は、当面は非推奨になりません。 

RMI jdk1.2が導入され、EJBはRMIシステムにあり、遅延アクティベーションを使用します。遅延アクティベーションは、クライアントがオブジェクトを初めて使用するまで(つまり、最初のメソッド呼び出し)、オブジェクトのアクティベーションを延期します。RMIアクティベーションは非常に使いやすいのに、なぜ破棄する必要があるのでしょうか。 

最新のアプリケーションの場合、ほとんどの分散システムはWebベースであるため、Webサーバーは、ファイアウォールの通過、要求のフィルタリング、認証、およびセキュリティの問題を解決し、多くの遅延ロードテクノロジも提供します。 

そのため、最近のアプリケーションでは、RMIアクティベーションが使用されることはめったにありません。また、さまざまなオープンソースコードベースでは、RMIアクティベーションを使用するためのコードは基本的に見つかりません。RMIアクティベーションのメンテナンスコストを削減するために、JDK8ではRMIアクティベーションがオプションとして設定されています。JDK15では、最終的に破棄できるようになりました。 

 

終了します。テストコードアドレス:https//github.com/cyberHermanwang/Java15Feature

 

シャンシリコンバレーありがとう!

おすすめ

転載: blog.csdn.net/cyberHerman/article/details/109253931