質問の歴史:
Javaにおけるデータとメソッドへのアクセスレベルの制御は、カプセル化とクラスの内部構造の保護を目的として導入されました。これは、実装を隠し、オブジェクトの状態の無許可の変更を防ぐための重要なOOPの一部です。
問題:
異なるアクセス修飾子—public、protected、(package-private)、private—は、クラスメンバーの可視性を異なって制限し、多くの場合これは明白ではありません。不適切に選択されたレベルは、バグや望ましくない権限の拡張、カプセル化の違反を引き起こす可能性があります。
解決策:
各フィールドまたはメソッドには、必要最低限のアクセス修飾子を使用すること。Javaは以下をサポートしています:
コードの例:
public class Dog { private String name; // Dog内部のみで見える String breed; // package-private protected int age; // パッケージ内およびサブクラスで見える public void bark() { // どんなコードからでもアクセス可能 System.out.println("Woof!"); } }
重要な特徴:
内部クラスは外部クラスのすべてのprivateフィールドにアクセスできますか?
はい、内部クラスは外部クラスのすべてのフィールドとメソッドに完全にアクセスできます、たとえそれがprivateであっても。逆に、外部クラスはそのインスタンスを持っている限り、内部クラスのprivateメンバーにアクセスできます。
protectedクラスメンバーは、継承なしでパッケージの外からアクセス可能ですか?
いいえ。パッケージの外ではprotectedは継承者にとって便利ですが、クラスのオブジェクトを介してアクセスすることはできません。
クラスがpublicとして宣言されていないが、他のパッケージからインポートされた場合はどうなりますか?
package-privateレベルのクラスは、自身のパッケージの外で明示的にインポートして使用することはできません。別のパッケージのコードからそのクラスにアクセスしようとするとコンパイルエラーが発生します。
ネガティブケース
DTO用のすべてのクラスフィールドがpublicとしてマークされ、アクセスが簡略化されています
利点:
欠点:
ポジティブケース
privateフィールドとpublicアクセスメソッドが使用されています
利点:
欠点: