💭

Java カプセル化

2024/12/10に公開

Java

カプセル化

  • カプセル化を理解していない状態でクラスを作ると、アクセス制限のないクラスが作られる可能性がある。
  • アクセス制限のないクラスはオブジェクトとして適切な状態ではない。
  • カプセル化は、外部からの自由なアクセスを制限しオブジェクトを守る。
  • カプセル化は外部からのアクセスを完全にシャットアウトするわけではなく、必要な範囲については、外部からアクセスできる入り口を用意しておく。
  • アクセス修飾子を利用して外部からのアクセスを制限する。アクセス修飾子とは、"フィールド"や"メソッド"の前に付けてアクセス範囲を決める修飾子。

カプセル化[プログラム例]

カプセル化は外部からのアクセスを完全にシャットアウトするわけではなく、必要な範囲については、外部からアクセスできる入り口を用意しておく。

package some.package;

public class Capsule_Person1 {

   //idフィールド(アクセス修飾子private)
   //privateなフィールドの値のため、他クラスから直接アクセスできない。
   private int id = 5;

   //コンストラクタ
   Capsule_Person1(){
   }

   //出力メソッド(アクセス修飾子public)
   //publicなメソッドを通して、
   //他クラスからprivateなフィールドの値を取得できるようにする。
   public void output(){
   	System.out.println("idは" + this.id);
   }

  //ゲッター(アクセス修飾子public)
  //ゲッターによりpublicなメソッドを通して、
  //他クラスのprivateなフィールドの値を取得できる
  public int getId() {
     return this.id;
  }

  //セッター(アクセス修飾子public)
  //セッターによりpublicなメソッドを通して、
  //他クラスのprivateなフィールドの値を編集できる
  public void setId(int id) {
     this.id = id;
  }

}
package some.package;

public class Capsule_Test1 {
  public static void main(String[] args) {
    //Capsule_Person1クラスのオブジェクトを作る
  	Capsule_Person1 person1 = new Capsule_Person1();

  	//出力メソッドを実行する
  	person1.output();

    //以下はNG。
    //public class Capsule_Person1 のidはprivateで修飾されているので、
    //person1.idで直接アクセスできない。
    System.out.println("idは" +person1.id);

  //ゲッターでは実行できる。
    int id = person1.getId();
    System.out.println("idは" + id);	

    //セッターでも実行できる。
    person1.setId(7);
    int id = person1.getId();
    System.out.println("idは" + id);
  }
}

"eclipse"では、ゲッターとセッターを自動生成できる

  • 右クリック > "ソース" > "ゲッターセッター自動生成"をクリック。
  • アクセス修飾子は "public" を選択。
  • コメントは基本付けておく。
    * セッターでは変数のアクセスにフィールド名に”this.”をつけ忘れないようにする。
    this.id //[GOOD]
    //id      [BAD] 

Discussion