Javaのカプセル化: メリット、実装方法、サンプルコード付きで解説

スポンサーリンク
この記事は約9分で読めます。

カプセル化の概要

カプセル化(Encapsulation)は、オブジェクト指向プログラミングの重要な概念の一つで、データ(属性)とそれを操作するコード(メソッド)を一つの単位(クラス)にまとめ、外部からの直接アクセスを制限することです。これにより、データの整合性と安全性を保つことができます。

カプセル化のメリット

  • データの保護: クラスの内部状態を隠蔽することで、データの不正なアクセスや改変を防ぎます。
  • 変更の容易さ: クラス内部の実装を変更しても、外部に影響を与えずに済みます。
  • メンテナンス性の向上: データとそれを操作するメソッドを一緒に管理することで、コードの可読性と保守性が向上します。

カプセル化の実装方法

カプセル化を実現するためには、以下の手法を使用します。

  1. クラスの属性を private にします。
  2. 属性へのアクセスと更新を行うための getter メソッドと setter メソッドをアクセサメソッドといいます。

アクセサメソッドの一般的な命名の仕方

  1. getter:getフィールド名
  2. setter:setフィールド名

※フィールド名の先頭文字は大文字にします。

サンプルコード

Product クラス

package shop;

public class Product {

	// プライベートフィールド
	private String name = "";
	private int price = 0;

	// コンストラクタ
	public Product(String name, int price) {
		setName(name);
		setPrice(price);
	}

	// nameのgetterメソッド
	public String getName() {
		return name;
	}

	// nameのsetterメソッド
	public void setName(String name) {
		this.name = name;
	}

	// priceのgetterメソッド
	public int getPrice() {
		return price;
	}

	// priceのsetterメソッド
	public void setPrice(int price) {
		if (price >= 0) {
			this.price = price;
		} else {
			displayError(price);
			this.price = 0;
		}
	}

	// 商品情報の表示メソッド
	public void displayInfo() {
		print("商品名: " + name);
		print("価格: " + price + "円");
	}

	private void displayError(int price) {
		print("エラー:" + name + "の価格「" + price + "」マイナスを設定できません。");
		print("価格を再設定します。");
	}

	private static void print(String text) {
		System.out.println(text);
	}

}

Main クラス

package driver;

import shop.Product;

public class Driver {

	public static void main(String[] args) {
		sample3();       //sample1~6でテストを実施
	}

	/**
	 * 正常→なし=エラーなし
	 */
	private static void sample1() {
		Product smartphone = new Product("スマートフォン", 1000);
		smartphone.displayInfo();
	}

	/**
	 * 異常→なし=エラー
	 */
	private static void sample2() {
		Product strap = new Product("ストラップ", -500);
		strap.displayInfo();
	}

	/**
	 * 正常→正常=エラーなし
	 */
	private static void sample3() {
		Product smartphone = new Product("スマートフォン", 1000);
		smartphone.setPrice(800);
		smartphone.displayInfo();
	}

	/**
	 * 異常→異常=エラー
	 */
	private static void sample4() {
		Product strap = new Product("ストラップ", -500);
		strap.setPrice(-100);
		strap.displayInfo();
	}

	/**
	 * 正常→異常=エラー
	 */
	private static void sample5() {
		Product strap = new Product("ストラップ", 500);
		strap.setPrice(-100);
		strap.displayInfo();
	}

	/**
	 * 異常→正常=エラーなし
	 */
	private static void sample6() {
		Product strap = new Product("ストラップ", -100);
		strap.setPrice(100);
		strap.displayInfo();
	}

}

サンプルコードの説明

Productクラス

  1. プライベートフィールド
    • name: 商品名を保持する文字列型のフィールド。
    • price: 価格を保持する整数型のフィールド。
  2. コンストラクタ
    • Product(String name, int price): 商品名と価格を初期化する。価格が0以上でない場合、エラーメッセージを表示し、価格を0に設定する。
  3. getterメソッド
    • getName(): name フィールドの値を返す。
    • getPrice(): price フィールドの値を返す。
  4. setterメソッド
    • setName(String name): name フィールドに値を設定する。
    • setPrice(int price): 価格が0以上の場合に price フィールドに値を設定し、そうでない場合はエラーメッセージを表示し、価格を0に設定する。
  5. 商品情報の表示メソッド
    • displayInfo(): 商品名と価格を表示する。
  6. エラーメッセージ表示メソッド
    • displayError(int price): 不正な価格が設定された場合にエラーメッセージを表示する。

Driverクラス

  1. mainメソッド
    • sample6() メソッドを呼び出す。
  2. サンプルメソッド
    • sample1(): 正常な価格で商品をインスタンス化し、情報を表示する。
    • sample2(): 不正な価格で商品をインスタンス化し、情報を表示する。
    • sample3(): 正常な価格で商品をインスタンス化し、その後に正常な価格を設定して情報を表示する。
    • sample4(): 不正な価格で商品をインスタンス化し、その後に不正な価格を設定して情報を表示する。
    • sample5(): 正常な価格で商品をインスタンス化し、その後に不正な価格を設定して情報を表示する。
    • sample6(): 不正な価格で商品をインスタンス化し、その後に正常な価格を設定して情報を表示する。

特定のケースのみを実行したい場合

正しい価格の設定のみを出力したい場合

正しい価格の設定のみを出力したい場合は、sample1かsample3を指定します
Driver クラスの main メソッドを以下のように変更します

public class Driver {
	public static void main(String[] args) {
		// 正しい価格を設定するサンプル
		sample1();  // 正常→正常=エラーなし
	}
}
sample1の出力結果

初期で設定した15行目の1000円が出力されます

商品名: スマートフォン
価格: 1000円
sample3の出力結果

再設定した32行目の800円が出力されます。

商品名: スマートフォン
価格: 800円
不正な価格の設定を出力したい場合

不正な価格の設定を出力したい場合はsampleの値を2,4,5,6に設定します。
Driver クラスの main メソッドを以下のように変更します。

public class Driver {
	public static void main(String[] args) {
		// 不正な価格を設定するサンプル
		sample2();  // 異常→なし=エラー
	}
}
sample2の出力結果

このパターンでは、ストラップ”に -500を設定し再設定はしていないので「Productクラス」のフィールドが呼び出され価格が0円で出力されます。

エラー:ストラップの価格「-500」マイナスを設定できません。
価格を再設定します。
商品名: ストラップ
価格: 0円
sample4の出力結果

このパターンでは、2回とも−(マイナス)を指定していますので、エラーメッセージも2回出力され「Productクラス」のフィールドが呼び出され価格が0円で出力されます。

エラー:ストラップの価格「-500」マイナスを設定できません。
価格を再設定します。
エラー:ストラップの価格「-100」マイナスを設定できません。
価格を再設定します。
商品名: ストラップ
価格: 0円

sample5と6の詳細は割愛しますが出力結果のみ記載しますね。

sample5の出力結果
エラー:ストラップの価格「-100」マイナスを設定できません。
価格を再設定します。
商品名: ストラップ
価格: 0円
sample6の出力結果
エラー:ストラップの価格「-100」マイナスを設定できません。
価格を再設定します。
商品名: ストラップ
価格: 100円

このようにパターンのテストを行うことでより詳細な設定を確認できます。
正しい価格の設定のみ、または不正な価格の設定のみを出力することができますので、是非試してみてくださいね。

この記事が役に立ったと思ったらポチッ!と協力お願いします。

にほんブログ村 IT技術ブログ IT技術メモへ

コメント

タイトルとURLをコピーしました