カプセル化とは
カプセル化とは、クラス内のフィールドやメソッドに対するアクセスを制限するJavaの仕組み。
例えば、個人情報を扱うクラスがあり、このフィールドが外部から書き変えれたり情報を保護できないプログラムは危険。
カプセル化はこのような外部からのアクセスからオブジェクトを守る役目がある。
アクセス修飾子
カプセル化では、アクセス修飾子のprivateとpublicを使いアクセス制限を行うため、下記の設定を覚えておく。
アクセス修飾子 | 機能 |
---|---|
private | 自分のクラス内でのみアクセス可能 |
アクセス修飾子なし(package private) | 同じパッケージ内であればアクセス可能 |
protected | 継承した子クラス及び自分と同じパッケージからアクセスできる |
public | 自分のクラス以外からでもアクセス可能 |
package text.section_16;
public class Capsule_Tanaka1 {
// id フィールド宣言 アクセス修飾子private
private int id = 5;
// コンストラクタ
Capsule_Tanaka1(){
}
//出力するメソッド
public void output(){
System.out.println("idは" + this.id);
}
}
idフィールドはprivate int id = 5;
となっていて、カプセル化されています。
一方で出力メソッドではpublic void output(){
となっており、これは外部からのアクセスのみ許可していることになり安全なクラスと言える。
こちらのクラスに対して下記のコードを実行。
実行結果は、出力メソッドがpublic
なので下記の通り表示される。
試しに、出力メソッドをplivate
に変更したら実行結果はエラーになる。=外部からのアクセスも禁止になる。
// 出力するメソッドのアクセス修飾子をprivateに変更
//出力するメソッド
private void output(){
System.out.println("idは" + this.id);
}
ゲッター
ゲッターによりpublicなメソッドを通して、他クラスのprivateなフィールドの値を取得できる。
// ゲッターの書き方
public 戻り値の型 ゲッターの名前(){
return this.フィールド変数名;
}
先ほどの出力メソッドを消去して下記のゲッターに書き換える。
public int getId(){
return this.id;
}
そして一方のクラス呼び出し側の方も、下記のように変更。
実行結果
(これは、先ほどのPublic voidメソッドとの使い分けはどういうところで判断するのかな?これに関して参考になった記事)
ではsetterを使うメリットは何でしょう?
代表的なものを2つ上げます
読取/書込専用にできる
コードチェックができる
publicのメソッドを使用した時と同様、他クラスからprivateなクラスの値を参照できた。
セッター
セッターは、privateなフィールドの値を編集できるメソッドをpublicで定義。
// セッターの書き方
public void セッターの名前(編集するフィールドの型 任意の引数名){
this.フィールド変数名 = 任意の引数名
}
ゲッターの下に追記
そして、クラス呼び出し側のファイルも下記のように編集。
実行結果は、idがきちんと、setterで指定した値の7に変わっている。
getter/setterはセットで覚えておこう。