web-dev-qa-db-ja.com

Java 9の新しいキーワード

Java 9の最大の機能の1つは、Project Jigsawによって定義されたモジュールシステムになります。 Project Jigsaw:Under the Hood からスライドを読むと、JavaOne 2015で、次のソースコード:

// src/Java.sql/module-info.Java
module Java.sql {
   exports Java.sql;
   exports javax.sql;
   exports javax.transaction.xa;
}

ここで興味深いのは、ファイルが.Javaで終わり、moduleexportsの2つの新しいキーワードを使用しているように見えることです。 Java 9で導入される他のキーワードは何ですか?下位互換性はどのように処理されますか(つまり、moduleという名前の関数または変数)?

37
Will Sherwood

Java 9のモジュール宣言に追加されたキーワードは、 Java言語仕様、Java SE 9 Edition の3.9に要約されています。==:

さらに10文字のシーケンスは制限付きキーワードです:openmodulerequirestransitiveexportsopenstousesprovides、およびwith。これらの文字シーケンスは、ModuleDeclarationおよびModuleDirectiveプロダクション(§7.7)でターミナルとして表示される場合にのみ、キーワードとしてトークン化されます。 Java SE 9より前に記述されたプログラムとの互換性のために、他のすべての場所で識別子としてトークン化されています。例外が1つあります:ModuleDirectiveプロダクションで必要な文字シーケンスの右側に、文字シーケンス推移的は、区切り文字が後に続く場合を除いて、キーワードとしてトークン化されます。この場合、識別子としてトークン化されます。

現在moduleという名前のメソッド、またはここにリストされている他のキーワードを使用している場合、コンパイルは続行されます。

viewおよびpermitsは初期のジグソープロトタイプではキーワードでしたが、それらはずっと前に存在しないために簡略化されました。)

65
Mark Reinhold

これはおそらく完全なリストではなく、これらのどれも私の知る限りでは確定されていませんが、いくつかは見つかりました。

moduleexportsprovidesuseswithtorequires;説明 ここ

モジュールシステムは、ServiceLoader :: loadメソッドの呼び出しについてモジュールアーティファクトのクラスファイルをスキャンすることにより、サービスの使用を識別できますが、これは低速で信頼性が低くなります。モジュールが特定のサービスを使用することは、そのモジュールの定義の基本的な側面であるため、効率と明確さの両方のために、uses句を使用したモジュールの宣言でそれを表現します。

module Java.sql {
    requires public Java.logging;
    requires public Java.xml;
    exports Java.sql;
    exports javax.sql;
    exports javax.transaction.xa;
    uses Java.sql.Driver;
}

モジュールシステムは、現在のServiceLoaderクラスが行うように、META-INF/servicesリソースエントリのモジュールアーティファクトをスキャンすることで、サービスプロバイダーを識別できます。ただし、モジュールが特定のサービスの実装を提供することも同様に基本的であるため、モジュールの宣言では、provides句を使用して次のように表現しています。

module com.mysql.jdbc {
    requires Java.sql;
    requires org.slf4j;
    exports com.mysql.jdbc;
    provides Java.sql.Driver with com.mysql.jdbc.Driver;
}

...

module Java.base {
    ...
    exports Sun.reflect to
        Java.corba,
        Java.logging,
        Java.sql,
        Java.sql.rowset,
        jdk.scripting.nashorn;
}

また、viewおよびpermits

大規模なソフトウェアシステムでは、同じモジュールの複数のビューを定義すると便利な場合があります。 1つのビューは他のモジュールによる一般的な使用のために宣言でき、もう1つのビューは、密接に関連するモジュールの選択セットによる使用のみを目的とした内部インターフェイスへのアクセスを提供します。

たとえば、JNDIでは、com.Sun.jndi.toolkit.urlは、モジュール宣言で指定されているように、コスナミングモジュールとkerberosモジュールに対してのみ表示されるようにします。

view jdk.jndi.internal {
    exports com.Sun.jndi.toolkit.url.*;
    exports Sun.net.dns.*;
    permits jdk.cosnaming;
    permits jdk.kerberos;

}

これにより、モジュールの境界をより柔軟に定義できます。

optionalについての言及も聞きました。

5
Will

*

module mainModule @ 2.0 {

    requires A @ >= 3.0 ;   // Use version 3 or above  

    //scope:compilation,execution,reflection
    requires B for compilation optional execution;

    requires optional service S1; 
    requires static E; // need at compile time but optional at runtime 

    // let mmm requires mainModule then S2 will automatically be there for mmm
    requires transitive S2; 

    provides MI @ 2.0; 
    provides service MS with C; // provide service with impelemented class C

    exports  pack;  
    exports  pack.abc to D; //qulified export

    permits  MF;
    class    MMain;

    /*
     syntax for creating view
     view ModuleName {
         {ProvidesDir|ExportsDir|PermitsDir|EntrypointDir}
     }
   */

    view N {

        provides service NS with AD;
        exports  MA;
        permits  MB;
        class    Main;

     }
}

*それがあなたを助けるかもしれないそれをチェックしてください。

0
Abhishek Bansal