C++ とは異なり、データ メンバを宣言するときに "public" または "private" を指定しないと、同じパッケージ内のどこからでもアクセスできることがわかりました。
Java 言語の設計者は反対の方法を選択することもできましたが、代わりに、デフォルトで (同じパッケージ内で) クラス メンバーを public にすることを好みました。
理由はありますか?
C++ とは異なり、データ メンバを宣言するときに "public" または "private" を指定しないと、同じパッケージ内のどこからでもアクセスできることがわかりました。
Java 言語の設計者は反対の方法を選択することもできましたが、代わりに、デフォルトで (同じパッケージ内で) クラス メンバーを public にすることを好みました。
理由はありますか?
それらはパブリックではなく、同じパッケージのメンバーがアクセスできます。Java の精神は、特定のパッケージが一貫した一連の協調責任を表すというものであり、デフォルトでは相互運用できるはずです。
異なるセマンティクスを強制したい場合は、いつでも特定のアクセス レベルを使用できます。
Java のデフォルトの可視性は package-private です。これは、同じパッケージからの場合、これらのエンティティにアクセスできることを意味します。デフォルトの可視性が公開されているとあなたが考える理由がわかりません。
@anOObはコメントでこれを書きました...そしてそれは徹底的な応答に値します。
アクセサを作成する手間をかける必要がなかったので、Javaが別のクラスから1つのクラスのデータメンバーを(別のファイルに)設定できるようにしたとき、私はうれしく驚きました。それはより便利ですが、OOの原則の1つに反していませんか?
実際にはOOよりも深いです。この原則はデータカプセル化の原則であり、オブジェクト指向以外の設計にも適用されます。
アクセサーとミューテーターの主な目的は、状態をカプセル化することです。つまり、クラスの実装の詳細がクラスの外部に表示されないようにするためです。これを行う主な理由は2つあります。
これにより、実装タイプと状態変数の不変条件を簡単に変更できます。クラスを使用するコードがオブジェクトの状態にアクセスするためにアクセサー/ミューテーター(つまり、ゲッター/セッター)のみを使用する場合、呼び出し元からの変更の影響を隠しながら、クラスの状態表現と不変条件に変更を加えることができます。たとえば、これは簡単な例です
private int counter;
public int getCounter() { return counter; }
になります
private long counter;
public int getCounter() { return (int)counter; }
public long getLongCounter() { return counter; }
Javaでアクセサー/ミューテーターを使用する理由はさらに2つあります。
アクセサーまたはミューテイターメソッドの動作は、通常、サブクラスでオーバーライドできます。対照的に、Javaでは、公開された属性の可視性をオーバーライドしたり、変更したりすることはできません。
JavaBeans仕様の規則に従うメソッド名/シグニチャを持つアクセサとミューテータを持つクラスに依存するフレームワーク/ツールはたくさんあります。
また、単純なgetterメソッドとsetterメソッドはJITコンパイラーによってインライン化されるため、パフォーマンスへの影響は最小限であることに注意してください。
アクセサを作成することを、避けようとする「面倒」と考えるべきではありません。実際、アクセサー(およびミューテーター)は、高品質のJavaコードを作成する上で重要な部分です。これは「ベストプラクティス」と見なされ、一般的なスタイル/バグチェッカープログラムは、公開された状態変数に問題としてフラグを立てます。
彼らがJavaを発明したときのsunの背後にある決定はわかりませんが、私見は、プライベートまたはパブリッククラスよりもはるかに頻繁にパッケージプライベートタイプが必要なためです。
たとえば、org.example.myapi.* で API を作成する場合、外部からの API への呼び出しをできるだけ少なくして、思考をシンプルに保ち、API に実行させるために必要なすべてのヘルパー クラスを必要とするようにします。彼らがすべきことは、外から見られるべきではありません。ほとんどの場合、パブリック API 呼び出しクラスよりも多くのパッケージ プライベート API ヘルパー クラスが必要です。
アクセスレベルをデフォルトにしておけばよかった、というだけの話ですprivate
。package
他の人が指摘しているように、パッケージは「協調的な責任の一貫したセットを表す」ため、アクセスレベルが最も頻繁に使用されるアクセスレベルになるという考えがおそらくありました( Visage)。private
ただし、これが最も頻繁に使用されるアクセス レベルである ことが判明しました。
IMO、Java 設計者はprivate
、timemachine があれば、仕様を変更してデフォルトのアクセス レベルを作成します。
参考までに:
-------------------------------------------------- 修飾子 クラス パッケージ サブクラス ワールド -------------------------------------------------- パブリック YYYY 保護された YYYN 修飾子なし YYNN プライベート YNNN
あなたの仮定は間違っています。デフォルトでは、フィールドはパブリックではありません。次の表は、Java のすべての可視性レベルを示しています。
Modifier Class Package Subclass World
public Y Y Y Y
protected Y Y Y N
no modifier Y Y N N
private Y N N N
詳細はこちら: http://download.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html