他のユーザーが使用するJavaライブラリを設計しているとします。ライブラリをプロジェクトにインポートして使用できるJARにコンパイルします。
言うまでもなく、ライブラリーは特定の方法で、特定のインターフェースを介して使用されることを意図しています。たとえば、ライブラリを制御するためにいくつかのFacadeクラスを作成し、ドキュメントにライブラリの使用方法、すべてのクラスとメソッドの用途などを記述します。
しかし、ユーザーから特定のクラスを完全に隠す方法はありますか?すべてのライブラリーには、ライブラリーによって内部的に使用され、ライブラリーを使用するコードによって直接使用されることは想定されていない特定のクラス(通常、クラスの大部分を占めると考えられます)があります。
「このクラスは、このJAR内またはこのパッケージ内のこのライブラリによる内部使用のためのものであり、このライブラリの境界外では使用できません」と述べる方法はありますか?これは技術的に可能ですか?または、特定のライブラリをユーザーが使用してはならないことをドキュメントに記載するだけで十分ですか?
_package-private
_を使用します。これは、アクセス修飾子をまったく指定しない場合に得られるものです。クラスまたはメソッドを、それが入っているパッケージからのみ見えるように制限します。
_package animals;
public class Animal { ... };
public class Giraffe extends Animal {
void run() { ... }
public void jump() { ... }
}
class Platypus extends Animal { ... }
_
imports
animals
パッケージであるすべてのコードはAnimal
クラスとGiraffe
クラスを表示できますが、 notPlatypus
クラス。さらに、そのコードはGiraffe.jump()
メソッドを呼び出すことができますが、Giraffe.run()
メソッドを呼び出すことはできません。ただし、insideパッケージでは、Giraffe
のメソッドとPlatypus
クラスの両方が表示されます。
これはネストされたパッケージでは機能しませんなので、パッケージA
のパッケージプライベートクラスをパッケージ_A.B
_のクラスに表示することはできません。これは、ネストされたパッケージがreallyネストされていないため、Javaによって2つの異なるパッケージとして扱われ、パッケージA
と_A.B
_は、他の2つのパッケージと同じように相互作用します。