短い答え
これは、このモジュールのために、本質的に公開されていますモジュール内のいくつかの要素がある場合に役立つことができますが、このモジュールの外部アクセスできないようにしてください。
これはできません。 (単独で、モジュールシステムの手段を - 回避策があります。)
:でパブリック型を検討
Javaコンパイラと仮想マシンあるモジュール内のパッケージがにアクセス可能であり、第1のモジュールが第2のモジュールによって上記で定義された意味で読取り可能であるときにのみ他のモジュールのコードによってアクセス可能であり、第1のモジュールはそのパッケージをエクスポートする。 [...]
このようにアクセスできないモジュール境界を越えて参照される型は、プライベートメソッドまたはフィールドが使用できないのと同じ方法で使用できません。それを使用しようとすると、エラーが報告されます。コンパイラ、IllegalAccessError
がJava仮想マシンによってスローされたり、IllegalAccessException
がリフレクション実行時APIによってスローされたりする可能性があります。 [...]
モジュールの境界を越えて参照されるメソッドまたはフィールドは、その意味でその囲み型にアクセスできる場合、およびメンバー自体の宣言もアクセスを許可する場合にアクセス可能です。
コンパイラ/ JVMがアクセスタイプ追加のメカニズムがを適用していないと認めると、エクスポートすることができます正確にどのようにして、パッケージを誰にさまざまな方法がありますが。そのメンバーはジグソーパズルの前と同じくらいアクセス可能です。
これは、(アクセシブルな型のパブリックメンバがアクセス可能であるため)アクセス可能な型のメンバをモジュール内で見ることができない(つまり、public
を必要とする)が、その外側にないことを意味します。
回避策
だから、将来のJava 9でそれを行うには、他の可能性はありますか?
はい。 :)
あなたは、世界にエクスポートするメソッドを定義するエクスポートされたパッケージに、Global
を持つことができます。次に、インタフェースまたはクラスのいずれかを持ってLocal
Global
を拡張し、必要なすべてのメンバーを追加します。キーはLocal
はでなければなりません。は輸出パッケージになります!
あなたのモジュールのAPIがGlobal
-sを返すだけですが、それらをメソッドの引数として受け取らない場合、あなたはうまく行きます。内部的には常にLocal
を使用してキャストしてください。
Global
-sも受け入れている場合は、APIが返されたインスタンス(つまり、ユーザーが独自の実装を作成することは許可されていない)のみであることを明確に文書化する必要があります。これは禁止されているように聞こえるかもしれませんが、元の要求について懸命に考えるならば、それは同じ特性を持ちます。
私の理解によれば、モジュールはデフォルトでは閉じられています。あなたは明示的に物を輸出して、物を外部から必要とするようにしなければなりません。 http://openjdk.java.net/projects/jigsaw/quick-startおよびhttps://en.wikipedia.org/wiki/Java_Module_System。あなたがここで尋ねていることを誤解していますか? – Gimby
[モジュールシステムの状態](http://openjdk.java.net/projects/jigsaw/spec/sotms/)によれば、エクスポートされたパッケージのみがモジュール外で利用可能です。たとえば、[このテーブル](http://stackoverflow.com/questions/215497/in-java-difference-between-default-public-protected-and-private/33627846#33627846)も参照してください。 – aioobe
@Gimbyあなたは正しいです:特定のパッケージをエクスポートすることは可能です。しかし、方法や分野はどうですか?はい、私はあなたが私の質問をかなり理解していると思います。 – Andremoniy