web-dev-qa-db-ja.com

ライブラリを作成するときに、特定のクラスを完全にライブラリの内部に作成し、ライブラリのユーザーに公開しない方法はありますか?

他のユーザーが使用するJavaライブラリを設計しているとします。ライブラリをプロジェクトにインポートして使用できるJARにコンパイルします。

言うまでもなく、ライブラリーは特定の方法で、特定のインターフェースを介して使用されることを意図しています。たとえば、ライブラリを制御するためにいくつかのFacadeクラスを作成し、ドキュメントにライブラリの使用方法、すべてのクラスとメソッドの用途などを記述します。

しかし、ユーザーから特定のクラスを完全に隠す方法はありますか?すべてのライブラリーには、ライブラリーによって内部的に使用され、ライブラリーを使用するコードによって直接使用されることは想定されていない特定のクラス(通常、クラスの大部分を占めると考えられます)があります。

「このクラスは、このJAR内またはこのパッケージ内のこのライブラリによる内部使用のためのものであり、このライブラリの境界外では使用できません」と述べる方法はありますか?これは技術的に可能ですか?または、特定のライブラリをユーザーが使用してはならないことをドキュメントに記載するだけで十分ですか?

8
Aviv Cohn

_package-private_を使用します。これは、アクセス修飾子をまったく指定しない場合に得られるものです。クラスまたはメソッドを、それが入っているパッケージからのみ見えるように制限します。

_package animals;

public class Animal { ... };

public class Giraffe extends Animal {
    void run() { ... }
    public void jump() { ... }
}

class Platypus extends Animal { ... }
_

importsanimalsパッケージであるすべてのコードはAnimalクラスとGiraffeクラスを表示できますが、 notPlatypusクラス。さらに、そのコードはGiraffe.jump()メソッドを呼び出すことができますが、Giraffe.run()メソッドを呼び出すことはできません。ただし、insideパッケージでは、GiraffeのメソッドとPlatypusクラスの両方が表示されます。

これはネストされたパッケージでは機能しませんなので、パッケージAのパッケージプライベートクラスをパッケージ_A.B_のクラスに表示することはできません。これは、ネストされたパッケージがreallyネストされていないため、Javaによって2つの異なるパッケージとして扱われ、パッケージAと_A.B_は、他の2つのパッケージと同じように相互作用します。

10
Jack