カプセル化とは

プロパティの隠蔽化

カプセル化はオブジェクト指向プログラミングの3大要素の1つで、クラスのメンバ変数を外部から直接参照させない(隠蔽化)する仕組みです。

アクセサメソッド

カプセル化はメンバ変数(プロパティ)をもとに getter / setterメソッドで定義するアクセッサメソッドを利用します。

  • setter:「set + プロパティ名」で値を設定
  • getter:「get + プロパティ名」で値を取得

getter/setter メソッドの例

フィールド「email」の getter / setterメソッドを定義した例です。

  // フィールド
  private String email; 

  //setter
  public void setEmail(String email) {
    this.email = email;
  }

  //getter
  public int getEmail() {
    return this.email;
  }

アクセサメソッドの作成

Eclipseでは、メンバ変数(プロパティ)からアクセッサメソッドを自動生成できます。

ファイル構成

 sns/
   ├── App.java
   └── entity
          └── UserBean.java

プロパティ定義

「UserBean」にprivateプロパティを定義します。

UserBean.java
package sns.entity;

public class UserBean {

	private String email;
	private String name;
	private String password;

}

getter/setterの追加

「UserBean」を右クリックして、「ソース > getter および setterの生成...」を選択します。

【すべて選択】ボタンで getter / setterのプロパティをすべてチェックし、【生成】ボタンをクリックします。

getter / setterが生成されました。

UserBean.java
package sns.entity;

public class UserBean {

	private String email;
	private String name;
	private String password;

	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
}

setterの利用

プロパティに直接設定

privateのメンバー変数に、値を設定します。

App.java
package sns;

import sns.entity.UserBean;

public class App {

	public static void main(String[] args) {
		UserBean user = new UserBean();
        user.name = "東京 太郎";
        user.email = "[email protected]";
        user.password = "pass12345";
	}

}

コンパイルエラー

コンパイルエラーになりました。

setterの利用

エラー部分をコメントアウトして、setterでデータを設定してみましょう。

App.java
	public static void main(String[] args) {
		UserBean user = new UserBean();
//        user.name = "東京 太郎";
//        user.email = "[email protected]";
//        user.password = "pass12345";

        user.setName("東京 太郎");
        user.setEmail("[email protected]");
        user.setPassword("pass12345");
	}

getter

プロパティを直接取得

privateプロパティに直接アクセスします。

	public static void main(String[] args) {
		...
        
        System.out.println(user.name);
        System.out.println(user.email);
        System.out.println(user.password);
	}

コンパイルエラー

コンパイルエラーになりました。

getterの利用

プロパティに直接設定

privateのメンバー変数に、値を設定します。

App.java
	public static void main(String[] args) {
        ....

        System.out.println(user.getName());
        System.out.println(user.getEmail());
        System.out.println(user.getPassword());
	}
結果

getterでデータが取得できました。

東京 太郎
[email protected]
pass12345

演習

問題1

「private int price;」の「setter」メソッドの定義で正しいのはどれですか?

1)public void setPrice() { this.price = price; }

2)public void setPrice(int price) { this.price = price; }

3)public int setPrice() { return this.price; }

4)public int setPrice(int price) { return this.price; }

問題2

「private int price;」のデータ取得で正しいのはどれですか?

1)public void getPrice() { this.price = price; }

2)public void getPrice(int price) { this.price = price; }

3)public int getPrice() { return this.price; }

4)public int getPrice(int price) { return this.price; }

問題3

「private int price;」の「setter」によるデータ設定で正しいのはどれですか?

1)item.getPrice();

2)item.setPrice();

3)item.getPrice(300);

4)item.setPrice(300);

問題4

「private int price;」の「getter」によるデータ取得で正しいのはどれですか?

1)item.getPrice();

2)item.setPrice();

3)item.getPrice(300);

4)item.setPrice(300);

問題5

「Character」クラスで、setter/getterを実装し、コンパイルエラーが発生した箇所を修正してみましょう。