クラスのメンバーへのアクセスを制御するチュートリアルを読んでいます。package-private を使用するための適切なユースケースは何か混乱しています。私が理解しているように、いつでもパッケージ宣言をそのようなクラスのパッケージ宣言に変更して、それがパブリッククラスであるかのように振る舞うことができるからです。これが良いことではないことは理解していますが、何が私を止めているのでしょうか?
3 に答える
私が理解しているように、いつでもパッケージ宣言をそのようなクラスのパッケージ宣言に変更し、それがパブリッククラスであるかのように振る舞うことができるからです
まず、アクセス修飾子は開発者を支援するために存在します。たとえば、リフレクションなど、それらを回避する方法は常にあります。
これが良いことではないことは理解していますが、何が私を止めているのでしょうか?
それほど多くはありません!
ただし、開発者として、封印された .jar ファイルでクラスを配布できます。これは、基本的に、他の人をパッケージに入れさせないことを意味します。
JAR ファイル内のパッケージの封印
JAR ファイル内のパッケージはオプションでシールできます。つまり、そのパッケージで定義されているすべてのクラスを同じ JAR ファイルにアーカイブする必要があります。たとえば、ソフトウェアのクラス間でバージョンの一貫性を確保するために、パッケージを封印したい場合があります。
package-private クラス/メソッドを使用するいくつかの理由:
- ライブラリの一部であるが、ライブラリの API の一部ではない実装クラス。これにより、モジュラー コードを引き続き使用でき、実装クラスが API の一部として使用されないことを API のユーザーに示すことができます。
- テストで利用できるようにする。場合によっては (特にレガシー コードを使用する場合)、クラスまたはメンバーをより見やすくして、それらをより簡単に単体テストできるようにする必要があります。例として、リソースを集中的に使用する操作を実行するメソッドを使用してクラスをテストする場合があります。この操作は、テストで操作なしのバージョンでオーバーライドする必要があります。もう 1 つの例は、1 つの場所でのみ使用されるクラスです。アプリ全体から見えるようにするのではなく、単体テストを行う必要があります。
どちらの場合も、パッケージ プライベートの可視性を使用すると、コードを使いやすくすることができます (それを使用する人は、クラス/メンバーの使用目的の範囲をよりよく理解できます) 一方で、モジュール コードを引き続き使用できます。
「私を止めているもの」について:
Java セキュリティ メカニズムがあなたを止めている可能性があります。「ターゲット」パッケージが封印され、署名されている場合、Java はオリジナル以外のソースがそのパッケージでクラスを宣言することを許可しません。