42

Java 9 の最大の機能の 1 つは、Project Jigsaw によって定義されたモジュール システムです。Project Jigsaw: Under the Hood at JavaOne 2015 のスライドを読んでいるときに、次のソース コードに気付きました。

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

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

4

5 に答える 5

67

Java 9 でモジュール宣言に追加されたキーワードは、 Java 言語仕様、Java SE 9 Editionの §3.9 にまとめられています。

さらに 10 個の文字シーケンスが制限キーワードです: openmodulerequirestransitiveexportsopenstousesおよび 。これらの文字シーケンスは、ModuleDeclaration および ModuleDirective プロダクション (§7.7) でターミナルとして表示される場合にのみ、キーワードとしてトークン化されます。これらは、Java SE 9 より前に作成されたプログラムとの互換性のために、他のすべての場所で識別子としてトークン化されます。例外が 1 つあります。ModuleDirective プロダクションで文字シーケンスのすぐ右側にある require は、推移的な文字シーケンスがキーワードとしてトークン化されます。この場合、識別子としてトークン化されます。provideswith

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

(viewpermitsは、初期のジグソー プロトタイプのキーワードでしたが、単純化されてずっと前に存在しなくなりました。)

于 2016-03-31T01:38:19.107 に答える
6

これは完全なリストではない可能性が高く、私の知る限り最終決定されたものはありませんが、いくつか見つけました。

moduleexportsprovidesuseswithtoおよびrequires;もあります。ここで説明:

モジュール システムは、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;
}

またviewpermits:

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

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

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

}

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

の言及も聞いたことがありoptionalます。

于 2016-03-31T00:49:12.600 に答える