Javaのアクセス修飾子!private・ publicでのスコープを確認する。
この記事では、private・public といったJavaのアクセス修飾子について勉強する。
プログラマはアクセス修飾子を使いこなすことによって、変数などの値が不必要に改変されることを防ぐことができる。アクセス修飾子の正しい使い分けはプログラマが覚えておくべきコーディングにおける作法のひとつと考えよう。
アクセス修飾子とは?
アクセス修飾子とは、変数やクラスの前に記述されるprivateやpublic といった修飾子だ。
このアクセス修飾子は変数やメソッドのプログラム内でのスコープ(可視範囲)を指定するもの。
「アクセス制御」「アクセスレベル」といった表現をされることもある。
アクセス修飾子のスコープ一覧
Javaには、package privateを含めて全部で4つのアクセス修飾子がある。
4つ修飾子それぞれのスコープを一覧にしてあらわすと以下のようになる。
修飾子 | クラス内 | パッケージ内 | 子クラス | すべて |
public | 〇 | 〇 | 〇 | 〇 |
protected | 〇 | 〇 | 〇 | × |
package private | 〇 | 〇 | × | × |
private | 〇 | × | × | × |
修飾子を指定しない場合は自動的にpackage privateの扱いとなる。
実践での使い分け
実践におけるアクセス修飾子の使い分けについて考えてみよう。
ここではよく使われるpublic・privateから順に見ていく。
public
publicはもっとも可視範囲の広いアクセス修飾子だ。
publicを用いる例としては以下のようなケースが想定される。
- モデルクラスのGetter・Setter
- クラス外から使用されることを想定したメソッド
- プロジェクトのどこからでも参照される定数
private
次に可視範囲のもっとも狭いprivateについて考えてみよう。
privateを用いる例としては以下のようなケースが想定される。
- モデルクラスの要素
- 使用される範囲を限定したいメソッド
- メンバ変数の中でクラス外からアクセスする必要のないもの
package private(修飾子なし)
次はpackage privateと呼ばれる修飾子なしのパターンを考えてみよう。
package privateのスコープはprivateとほぼ同じ。唯一の違いは同じパッケージに含まれるクラスがスコープに含まれるかどうかという点。パッケージとはJavaのクラスを分類するための仕組みで、使用していない会社も多いかもしれない。
privateにするかpackage privateにするかは意見が分かれる部分かと思うが、個人的にはprivateを付けてアクセス範囲を明確にしたほうがいいと思う。
protected
protectedはpackage privateに加え子クラスからのアクセスを認める修飾子。
子クラスとはextendsを用いてクラスを継承する際に継承する側のクラスに当たる。
この子クラスから親クラスの変数やメソッドにアクセスしたいが、publicにするのは避けたいというケースは実践において結構ある。そういった場合に使用するのがprotectedだ。
使い分けのまとめ
修飾子の使い分けについてまとめると以下のようになる。
- まずはprivateでいいか考える。
- 外部クラスからアクセスする必要のあるものをpublicにする。
- 継承を使用していて子クラスからのアクセスが必要なものをprotectedにする。
修飾子の使い分けに悩む場合は、必要な範囲でなるべく可視範囲の狭い修飾子を選べぶのが望ましい。
ただし、開発チームごとに使い分けのルールが定められている場合は、そのルールに則って修飾子を決定する。