Javaのpackage-privateとは、アクセス修飾子(public、protected、private)を指定しない「デフォルト」のアクセスレベルです。このクラスのメンバー(メソッド、フィールド、またはクラス自体)は、同じパッケージのクラスからのみアクセス可能です。
class MyClass { /* ... */ } void doSomething() { /* ... */ }
例:
// ファイル: com/example/internal/Helper.java class Helper { static void help() { System.out.println("helped"); } }
クラスやメソッドが内部実装の詳細である場合は、常にpackage-privateを使用してください。
質問: package-privateクラスは、継承やimportを通じて他のパッケージ内で見えることがありますか?
回答: いいえ、package-privateメンバーには、他のパッケージから継承やimportを通じてアクセスできません。これらは自分のパッケージ内でのみアクセス可能です。
物語
大規模なプロジェクトで、異なるチームがユーティリティロジックのためにpackage-privateクラスを使用し始めました。他のパッケージからコードを再利用しようとしたとき、アクセスできず、結果としてクラスをpublicにしなければならなくなり、内部実装が公開されました。
物語
マルチモジュールプロジェクトで、package-privateクラスがモジュールテストを書く際の問題の原因になりました。他のパッケージのテストはpackage-privateメソッドが見えず、テストを元のパッケージ内に移動させるか、アクセスレベルを緩和しなければなりませんでした。
物語
コードを新しいパッケージに移行した際に、予期しないコンパイル時エラーが発生しました。多くのメソッドとクラスが突然「消え」たのは、package-privateであり、パッケージ変更後にアクセスできなくなったためです。