4

私はSDKを作っていますが、私はクラスを別のパッケージに分けようとしています。これらのクラスは他の共有クラスを使用しています。問題は、私が共有クラスを公開した場合、誰もが自分のクラスだけでなく、それらを見ることができるということです。アプリケーションでアクセスできるようにする正しい方法は何ですか?パッケージと可視性

例:


パッケージ MyClass1

パッケージB 公共MySharedClass


C MyClass2

パッケージCは、公開MySharedClaあるのでそれにアクセスできるようになりますが、問題は世界にも見えるようになることです。どうすればそれを防ぐことができますか?

+0

可能な複製:http://stackoverflow.com/questions/4388715/java-expose-only-a-single-package-in-a-jar-file – bacar

答えて

3

パッケージはすべてJavaの「公開」です。パッケージ内のクラスは保護できます。のみ指定されたパッケージへのクラスの可視性を制限するため、この(無しpublic視認性改質剤)のようにそれを宣言する:そのように

class MyClass { 
    // ... 
} 

、MyClassのと同じパッケージ内のクラスのみができるようになりますそれを見るために。

+2

これを行うと、私はすべてのクラスを移動する必要がありますそのクラスを同じパッケージで使用しています。それが可能なら、私が避けようとしていたもの。 – Jimmy

+1

はい。すべての_internal_(非公開)クラスが一連のパッケージにグループ化され、パブリッククラスが別のパッケージにグループ化されるようにプロジェクトを構造化します。パブリックパッケージ内のパブリックファサードを介して内部クラスの機能を公開することができます。 –

1

クラスが2つの異なるパッケージのクラスによって共有されている場合、これらの2つのクラスはパブリッククラスではなく共有クラスと同じパッケージに入れる必要があります。同じパッケージのクラスで使用できます。

実際にはオプションではない場合は、共有クラスを適切に文書化して、SDK内部コードの外で使用されるはずでないことを示し、今後のバージョンで変更される可能性があり、パッケージは "内部"またはこれのようなものです。

+0

必要に応じて、後で内部クラスを難読化することさえできます。それでもあなたのクライアントに見えますが、もはや本当に使えません。また、非内部クラス用のjavadocを生成するだけで、内部クラスに依存しないようにすることができます。 – Robin

3

パッケージとして文書化されており、クライアントでは使用できないパッケージを作成します。

だけ特定のパッケージのクラスを公開するために、Javaの方法はありません:それは誰かパッケージプライベート(のみ宣言パッケージ内の公開)のためpublicのいずれか。

私はクラスの視認性に優れた制御を可能にするモジュールための提案があると思うが、我々はの場合には、少なくとも、

+1

+1参照http://stackoverflow.com/questions/4903879/package-names-impl-v内部およびJava 8モジュール==ジグソーパズルhttp://www.slideshare.net/mfrancis/java-8-modules-jigsaw-and-osgi-neil-bartlett – Fuhrmanator

1

protected修飾子が使用できるJava 8のために、待機する必要がありますクラスは同じパッケージ内でのみアクセスします。そうでなければ、可能性はない。

3

非自明:

インターフェースの一般アクセス集合によって定義することができる共有クラス。実際の実装は、Classloaderで明示的にロードする必要があります。その後、Javaセキュリティ管理メカニズムを適用して、実装クラスへのアクセスを制御するだけです。誰でもインターフェースを見ることができ、実際の実装へのアクセスはSDKに制限されます。

は、(上記のvarientのは、すべてのWeb /アプリケーションサーバーが行う必要があるものであるどのようにTomcatを他のいくつかのアプリの「パブリック」クラスにアクセスできないように思います。?)

編集:上記の注意ランタイムメカニズムであります。静的な(ポスト)コンパイル手法もあります。例えば、APTはここで効果的かもしれません。もちろん、私はあなたのパッケージの再構築(OP)に取り組んでおらず、一般的なアプローチへのアクセスを確保する方法にしか取り組んでいません。しかし、これらはちょっと「ハッキリ」です。クラスの読み込みの実行時のメカニズムは正準であり、厳密にはより正確です。