🦁

Javaのprotectedについて

2024/08/06に公開

継承を説明する時に大体出てくるprotectedについて
人に説明をしようとした時に、実はあまり理解できてなかったのでまとめ。

protectedとは?

Javaのprotectedは、クラスのメンバー(フィールドやメソッド)のアクセス制御を行うために使用するもの。
protectedが付けられたメンバーは、次の場合にアクセスできる。

  1. 同じパッケージ内のクラス:
    同じパッケージに属するクラスからアクセスできる。

  2. サブクラス(継承関係):
    継承しているクラスからアクセスできる。
    サブクラスが異なるパッケージに存在していても、継承しているクラスであればアクセスできる。

package com.example;

public class Parent {
    protected void display() {
        System.out.println("protectedのメソッド");
    }
}

/* -------------------- */
package com.example;

public class Child extends Parent {
    public void show() {
        display();  // protectedの対象と同じパッケージ内なのでアクセス可能
    }
}

/* -------------------- */
package com.another;
import com.example.Parent;

public class AnotherChild extends Parent {
    public void show() {
        display();  // 異なるパッケージでも継承関係があるのでアクセス可能
    }
}

/* -------------------- */
package com.another;
import com.example.Parent;

public class AnotherClass {
    public void show() {
        Parent parent = new Parent();
        parent.display();  // 異なるパッケージかつ、継承関係でもないのでアクセス不可
    }
}

protectedの利点は何?

  1. 親クラスのデータやメソッドをprotectedにすることで、
    サブクラスに対して適切な範囲でのみアクセスを許可し、外部から意図しない変更がされなくなる。

  2. 継承関係にあるクラスで、親クラスのprotectedメンバーを再利用することで、
    コードの重複を避けて保守しやすいコードがかける。
    サブクラスは親クラスのprotectedメンバーにアクセスできるので
    親クラスの機能を拡張しやすい。

protectedの注意点

protectedは別パッケージに対してはprivateだが
同一パッケージに関してはpublicのためクラスの内部実装が広範囲に公開される可能性がある。
継承しかさせないつもりでクラスを作ったとしても
同一パッケージのクラスからはすべて読み込めてしまうので
パッケージの作り方を気にしつつ、必要最小限の範囲で使用することがよい。

まとめ

protected同じパッケージに属するクラス継承しているクラスからアクセスできる。
使用箇所としては継承関係が多めな認識。
継承で再利用でき別パッケージであれば意図しないアクセスが拒否できる点がメリットそう。

Discussion