アクセス修飾子は、クラス、メソッド、フィールドの可視性を制御します。つまり、誰がそれらにアクセスできるかを制御します。これはカプセル化の背後にあるメカニズムです。Javaには、最も制限的なものから最も制限的でないものまで、4つのレベルがあります。
4つのレベル
java
{
a;
b;
c;
d;
}
Modifier Same class Same package Subclass (other pkg) Everywhere
────────────────────────────────────────────────────────────────────────
public ✓ ✓ ✓ ✓
protected ✓ ✓ ✓ ✗
(default) ✓ ✓ ✗ ✗
private ✓ ✗ ✗ ✗
注:修飾子を省略するとpackage-private(デフォルト)になります。これは同じパッケージ内でのみ可視です。これはpublicと同じではなく、異なるレベルです。
public class BankAccount {
private double balance; // hidden — protect the data
public void deposit(double amt) { // public API — controlled access
if (amt > 0) balance += amt;
}
public double getBalance() { // read-only access to private data
return balance;
}
}
// outside code CANNOT do account.balance = -1000 (it's private)
標準パターン:フィールドを**privateにし、制御されたpublic**メソッドを公開します。これは不変性を保護し、内部表現を変更できます。呼び出し元を壊すことなく、カプセル化の本質です。
✓ Fields → private (almost always); expose via methods if needed
✓ Public API methods → public
✓ Internal helpers → private
✓ For subclasses to access/override → protected
✓ Classes → public (usable anywhere) or package-private (internal to a module)
原則:まだ機能する最も制限的な修飾子を使用します(最小権限)。privateで始めて、必要な場合のみ公開します。
アクセス修飾子は、Javaがどのようにカプセル化を実装するかです。これは、内部の詳細を隠し、制御されたインターフェースを公開するOOPの基本原則です。
正しい修飾子を選択する(フィールドはデフォルトでprivate、意図されたAPIのみpublic)と、データ整合性が保護され、外部コードが内部に依存することがなくなります。そのため、自由にリファクタリングできます。また、クラスの意図された使用方法が明確になります。
4つすべてのレベルを理解することが重要です。特に、しばしば忘れられるpackage-privateデフォルトと、サブクラスにまたがるprotectedです。これは、カプセル化がよく取れた保守性の高いクラスとAPIを設計するため、およびシステムの残りの部分にどのくらいのコードが公開されているかを制御するために不可欠です。