Javaでは、フィールド、メソッド、クラスへのアクセスを管理するために、アクセス修飾子が使用されます: private、default(パッケージプライベート)、protected、public。
問題の歴史:
初期のJavaバージョンでは、厳格なオブジェクトカプセル化が使用されていました。柔軟性を持たせるために、完全なカプセル化と拡張性(継承やパッケージ内アクセス)をサポートするために異なるアクセスレベルが導入されました。
問題点:
不適切な修飾子の選択は、カプセル化の破壊、継承の問題、テストの困難、場合によっては誤ってデータが公開されることによるセキュリティバグを引き起こす可能性があります。
解決策:
アーキテクチャが許す最も制限的な修飾子を使用してください。フィールドは通常privateにし、getter/setterを介してアクセスします。メソッドはAPIの一部である場合にのみpublicにし、拡張のためにはprotectedにします。
コード例:
public class Person { private String name; // プライベートフィールド protected int age; // パッケージ内および派生クラスでアクセス可能 String email; // パッケージプライベート public String getName() { return name; } }
主な特徴:
private — クラス内部からのみアクセス可能protected — 他のパッケージの派生クラスにもアクセス可能public — すべての人にアクセス可能ローカル変数にアクセス修飾子を適用できますか?
いいえ。アクセス修飾子はクラス、メソッド、およびフィールド(内部クラス)にのみ適用され、ローカル変数には適用されません。
メソッド内にpublic修飾子を持つクラスを作成できますか?
いいえ。ローカルクラスはアクセス修飾子を持つことができず、常にメソッド内での可視性を持ちます。
protectedメンバーは他のパッケージのサブクラスでアクセスできますか?
はい、protectedメンバーは他のパッケージにいる派生クラスからアクセスできますが、通常のクラスにはアクセスできません。
すべてのクラスフィールドが偶然publicとして宣言され、他のクラスから直接アクセスされ、変更箇所を追跡するのが難しい。
利点:
欠点:
すべてのフィールドがprivateであり、公開メソッドが検証を伴うアクセスを制御し、必要な部分だけをprotectedとして派生クラスと拡張。
利点:
欠点: