簡潔な答え
モジュール内に、このモジュールに対して本質的に公開されているが、このモジュールの外部からはアクセスできない要素がいくつかある場合に役立ちます。
それは不可能です。(モジュールシステムのみの手段で - 回避策があります。)
長い答え
説明は、アクセシビリティという用語の中にあります。
Java コンパイラと仮想マシンは、最初のモジュールが 2 番目のモジュールから読み取り可能であり (上記で定義した意味で)、最初のモジュールがそのパッケージをエクスポートする場合にのみ、1 つのモジュールのパッケージ内のパブリック型が他のモジュールのコードからアクセス可能であると見なします。 . [...]
この方法でアクセスできないモジュールの境界を越えて参照される型は、プライベート メソッドまたはフィールドが使用できないのと同じ方法で使用できません。それを使用しようとすると、コンパイラによってエラーが報告されるか、IllegalAccessError
によってスローされます。 Java 仮想マシン、またはIllegalAccessException
リフレクティブ ランタイム API によってスローされる 。[...]
モジュールの境界を越えて参照されるメソッドまたはフィールドは、この意味でそれを囲む型がアクセス可能であり、メンバー自体の宣言でもアクセスが許可されている場合にアクセス可能です。
パッケージを正確にどのように、誰にエクスポートできるかについてはさまざまな方法がありますが、コンパイラ/JVM がタイプにアクセス可能であると判断すると、追加のメカニズムは適用されません。そのメンバーは、Jigsaw の前と同じようにアクセスできます。
これは、アクセシブルな型のメンバーをモジュール内で可視にする方法がないことを意味します (これには が必要ですpublic
)。
回避策
将来のJava 9でそれを行う可能性は他にありますか?
はい。:)
Global
エクスポートされたパッケージには、世界にエクスポートするメソッドを定義するパブリック インターフェイスを含めることができます。次に、インターフェイスまたはクラスLocal
を拡張し、必要なGlobal
すべてのメンバーを追加します。重要なのは、エクスポートされたパッケージに入れてLocal
はならないということです!
モジュールの API がGlobal
-s のみを返し、それらをメソッド引数として受け入れない場合は、問題ありません。内部で常に - を使用し、場合によっては - にキャストすることを確認してくださいLocal
。
-sも受け入れる場合Global
、これらは API が返すインスタンスのみであることを明確に文書化する必要があります (つまり、ユーザーは独自の実装を作成することはできません)。これは法外に聞こえるかもしれませんが、元の要求についてよく考えてみると、同じ特性を持っているはずです。