カプセル化の概要
カプセル化(Encapsulation)は、オブジェクト指向プログラミングの重要な概念の一つで、データ(属性)とそれを操作するコード(メソッド)を一つの単位(クラス)にまとめ、外部からの直接アクセスを制限することです。これにより、データの整合性と安全性を保つことができます。
カプセル化のメリット
- データの保護: クラスの内部状態を隠蔽することで、データの不正なアクセスや改変を防ぎます。
- 変更の容易さ: クラス内部の実装を変更しても、外部に影響を与えずに済みます。
- メンテナンス性の向上: データとそれを操作するメソッドを一緒に管理することで、コードの可読性と保守性が向上します。
カプセル化の実装方法
カプセル化を実現するためには、以下の手法を使用します。
- クラスの属性を
private
にします。 - 属性へのアクセスと更新を行うための
getter
メソッドとsetter
メソッドをアクセサメソッドといいます。
アクセサメソッドの一般的な命名の仕方
- getter:getフィールド名
- 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クラス
- プライベートフィールド
name
: 商品名を保持する文字列型のフィールド。price
: 価格を保持する整数型のフィールド。
- コンストラクタ
Product(String name, int price)
: 商品名と価格を初期化する。価格が0以上でない場合、エラーメッセージを表示し、価格を0に設定する。
- getterメソッド
getName()
:name
フィールドの値を返す。getPrice()
:price
フィールドの値を返す。
- setterメソッド
setName(String name)
:name
フィールドに値を設定する。setPrice(int price)
: 価格が0以上の場合にprice
フィールドに値を設定し、そうでない場合はエラーメッセージを表示し、価格を0に設定する。
- 商品情報の表示メソッド
displayInfo()
: 商品名と価格を表示する。
- エラーメッセージ表示メソッド
displayError(int price)
: 不正な価格が設定された場合にエラーメッセージを表示する。
Driverクラス
- mainメソッド
sample6()
メソッドを呼び出す。
- サンプルメソッド
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円
このようにパターンのテストを行うことでより詳細な設定を確認できます。
正しい価格の設定のみ、または不正な価格の設定のみを出力することができますので、是非試してみてくださいね。
この記事が役に立ったと思ったらポチッ!と協力お願いします。
コメント