カプセル化


カプセルの目的

フィールドを公開しない事により、変更してはならないフィールド値を謝って変更出来ない様にする。

アクセス制御について

アクセス制御のレベル

名前               プログラム中の記載方法 アクセスを許可する範囲
private private   自分自身と同じクラスのみ
package private 何も書かない(デフォルト)  自分自身と同じパッケージのみ
protected protected   自分自身と同じパッケージに属するか、自分を継承した子クラス
public public  全てのクラス                        

フィールド及びメソッドに対するアクセス制御について

(考え方)
基本的にフィールドにはprivateを使用する事が多い。メソッドは作成する度に適用範囲を考える。

メソッドを経由したフィールドの設定

getter

(使い方)

public 値を返す型 getフィールド名(){
  return this.フィールド名;//
}

(コード)

private String name;

public String getName(){
   return this.name;//このクラスのnameの値を返す
}

(呼出方法)

System.out.println(getName());

setter

(使い方)

public void setフィールド名(引数のデータ型 引数を入れる変数名){
  this.フィールド名=引数を入れる変数名
}

(コード)

private String name;

public void setName(String name){
   this.name = name
}

(呼出方法)

インスタンス名.setName("ヨシヒコ");

getter/setterを使うメリット

Read Only Write Only のフィールドを実現出来る。
→setだけの場合write Only、getだけの場合Read Only

フィールド名を変更しやすい
→フィールドの名前を変えた際、他のクラスがフィールド名を直接使用している場合は、他のクラスまで修正が必要になるが、get/setを使用している場合は、自身のクラス内のget/set内のクラス名の修正だけで済む。

フィールドに対する、アクセスを検査出来る
→(例)mpというフィールドに、0以下の値が代入された場合、throw new IllegalArgumentExceptionで強制的にエラーを発生させ、システムを終了する。

    public void setMp(int mp) {
        if (mp < 0) {
            throw new IllegalArgumentException("mpは0以上を設定して下さい");
        }
        mp = this.mp;
    }

クラスに対するアクセス制御

アクセス制御のレベル

名前               プログラム中の記載方法 アクセスを許可する範囲
public public   全て
package private 何も書かない(デフォルト)  自分自身と同じパッケージのみ

非publicクラスの特徴

・クラス名はソースファイル名と異なっても良い
・1つのソースファイルに複数のクラスを宣言して良い