71

package-private私は最近 Java を学んでいて、何も指定しない場合のデフォルトであるクラスの概念に出くわしました。しかし、私は気づいた:

  1. package-private クラスの使用はめったに見ません。これには理由がありますか。たとえば、深刻な欠点がある、冗長である、または単に十分に読んでいないなどです。その使用法に賛成/反対する強力な議論はありますか?

  2. ほとんどの場合、それが本当に役に立たないのなら、なぜそれがデフォルトなのですか?

  3. 現実世界で package-private を使用する必要があるのはどのような状況ですか? つまり、いつかけがえのないものになるのでしょうか。

つまり、デフォルトの package-private 修飾子の主な長所と短所は何ですか?

4

8 に答える 8

60

簡単に言えば、それはプライベートのやや広い形式です。

と の違いpublicと、問題のクラスの内部でのみ使用する場合にprivateメソッドと変数を作成することが一般的に良い方法である理由について、読者はよく知っていると思います。private

その拡張として、モジュール方式でソフトウェアを作成することを考えている場合は、moduleへのパブリック インターフェイスについて考えることができます。これは、内部に複数のクラスがあり、それらの間で共同作業を行います。publicこのコンテキストでは、メソッドが消費者によって呼び出される場合、メソッドを作成することは完全に理にかなっています。privateそれらがクラスの内部にある場合。そしてpackage private、それらがこのモジュール内のクラス間で呼び出すために使用されている場合、つまり、それはモジュールの実装の詳細 (パブリック呼び出し元から見た場合) ですが、複数のクラスにまたがっています。

パッケージシステムはこの種のことにはあまり役に立たないことが判明したため、これが実際に使用されることはめったにありません。特定のモジュールのすべてのクラスをまったく同じパッケージにダンプする必要がありますが、これは些細なことでは少し扱いに​​くくなります。したがって、アイデアは素晴らしいです-メソッドをほんの一握りの「近くの」クラスにアクセスできるようにし、わずかに広くprivateします-しかし、そのクラスのセットを定義する方法の制限は、それがめったに使用されない/有用であることを意味します.

于 2011-06-24T16:20:52.910 に答える
17

package-private の優れた点の 1 つは、それを使用して、そうでなければ単体テスト クラスに対してプライベートと見なすメソッドにアクセスできることです。もちろん、パッケージ内の他のクラスが実際に呼び出すべきではないときにそれを呼び出すことができるという欠点があります。

于 2011-06-24T17:14:17.720 に答える
3

package-private アクセス レベルは より制限的ですprotected。クラスをサブクラス化するだけで、保護された属性とメソッドにアクセスできます。保護されたメンバーは継承を目的としています (またはその可能性があります) が、パッケージ プライベート メンバーはそうではありません。

パッケージ内の複数のクラスが実装固有の属性または (ユーティリティ) メソッドにアクセスできるように、パッケージ プライベート メンバーがよく使用されます。

これの良い例は、StringStringBuilder.valuechar 配列の package-private コンストラクターです。

/*
* Package private constructor which shares value array for speed.
* this constructor is always expected to be called with share==true.
* a separate constructor is needed because we already have a public
* String(char[]) constructor that makes a copy of the given char[].
*/
String(char[] value, boolean share) {
    // assert share : "unshared not supported";
    this.value = value;
}

java.langそのため、パッケージ内のクラスは、セキュリティを損なうことなくStrings、コンテンツが既に に存在する場合に効率的に new を作成できます。char[]アプリケーションからこれを行うことはできません。可能であれば、String不変の a の内部 char 配列にアクセス (参照) することになるからです (リフレクションはカウントされません!)。

現在の値を保持する char 配列とこれへのアクセサ メソッドもパッケージ プライベートであるため (または、実装が行われる場所) では、さまざまなユーティリティ メソッドStringBuilderが使用され、内部の char 配列を公開することなく、効率的で高速な比較のためにこれを利用できます。世界"。AbstractStringBuilderchar[] valuechar[] getValue()StringcontentEquals(StringBuffer sb)contentEquals(CharSequence cs)

于 2015-02-10T07:05:50.053 に答える
2

「なぜそれがデフォルトになるのか」という質問に関して、このコンテキストでは、「デフォルト」という用語は、別の修飾子がないことを意味します。彼らは別のキーワードを発明できたと思いますが(「パッケージ」はすでに採用されています)、そうしませんでした。

現実の世界では、他のパッケージから呼び出したり使用したりしたくないユーティリティ クラスや抽象クラスにデフォルト アクセスを使用しています。インターフェイスと、抽象クラスから拡張された 2 つの具体的な実装があるとします。2 つの具象クラスを final として宣言するのは、必ずしも人々にそれらをサブクラス化してほしくないからです (Effective Java を参照)。また、同じ理由で、抽象クラスをいじくり回したくありません。抽象クラスにデフォルトのアクセスを使用すると、クラスをパッケージに配置した場合にのみ、クラスが表示されます。防弾ではありませんが、デフォルト アクセスの合理的な使用/説明だと思います。とはいえ、個人のように詳細が漏洩するのを防げない、つまり何も保証しないということは、

あまり頻繁に使用されていないもう 1 つの理由は、Javadoc からデフォルト アクセス権を持つクラスを除外する傾向があることです。

于 2011-06-24T16:32:36.923 に答える
1

1-アーキテクチャによって異なります-一般的に、自分だけのためにコードを書いている場合や小さなプロジェクトでは、おそらくそれを使用しないでしょう。大規模なプロジェクトでは、特定のメソッドが呼び出される場所と方法を確実に制御できると便利です。

2-デフォルト(つまり、パブリック/保護/プライベートではない)はプライベートと同じではありません-その4番目の状態。Javaアクセス制御を参照してください

3-基盤となるコードの実装方法にサードパーティが依存することを望まないライブラリを作成する場合、API自体を公開するだけで作業が楽になります。

于 2011-06-24T16:08:33.363 に答える
-1

「パッケージプライベート」は、複数のパッケージがある場合に使用されます。つまり、同じパッケージ内の他のクラスはそのクラスまたはクラスメンバーに「パブリック」としてアクセスでき、他のパッケージのクラスはアクセスできません。「プライベートライク」のようなものです。

于 2011-06-24T17:04:09.450 に答える
-1

クラスについて話すときは、次の 2 つのオプションしかないことに注意してください。

  1. 公開クラス
  2. パッケージプライベートクラス

「プライベートクラス」の概念は無意味です。(なぜどこにも使われていないクラスを作るのか?!)

したがって、API ユーザーに公開する必要のない中間操作用のクラスがある場合は、それを「パッケージ プライベート」として宣言する必要があります。

また、同じソース ファイルで多くのクラスを定義する場合、1 つのクラスのみをパブリックにすることができます (その名前は .java ファイル名と一致します)。他のクラスが同じファイルで定義されている場合、それは「パッケージ プライベート」である必要があります。

于 2013-01-03T15:04:40.040 に答える