#目的
- カプセル化に関しての復習と定着
#実際の手順と実例
###1.カプセル化とは
- カプセル化とはオブジェクトの情報をカプセルのようにまとめ、中身を隠蔽したままオブジェクトを利用すること
- カプセル化のイメージは
- 外から防御されている
- カプセルに包まれている
- 「オブジェクト内のデータ」を包み、「オブジェクト外からの不正アクセス」を防ぐ
これらのイメージを持って問題を例にして考えていきます。
###2.例題
####問題
「Practice.java」を実行した結果が同じになるように、「NoCapsule.java」を「Capsule.java」に変更して、カプセル化したプログラムに変更してください。
実行結果
好きな食べ物はラーメンです。
週に1回食べています。
最近は週に2回食べるようになりました。。。
NoCapsule.java
package practice;
public class NoCapsule {
public String food;
public int count;
public NoCapsule(String food, int count) {
this.food = food;
this.count = count;
}
}
Practice.java
package practice;
public class Practice {
public static void main(String[] args) {
NoCapsule eat = new NoCapsule("ラーメン", 1);
System.out.println("好きな食べ物は" + eat.food + "です。");
System.out.println("週に" + eat.count + "回食べています。");
eat.count = 2;
System.out.println("最近は週に" + eat.count + "回食べるようになりました。。。");
}
}
####回答
まず、問題通り、「NoCapsule.java」を「Capsule.java」に変更します。
このままでも実行は可能ですが、誤って外部のプログラムが変更禁止のフィールドを変更してしまうことを防止するため、メソッドやフィールドにアクセス修飾子を設定してアクセスを制限します。
Capsule.java
package practice;
//「NoCapsule.java」を「Capsule.java」に変更
public class Capsule {
// アクセス修飾子をpublicからprivavteに変更
private String food;
private int count;
public Capsule(String food, int count) {
this.food = food;
this.count = count;
}
// 実行ファイルで使用できるようにpublicで定義
public String getFood() {
return food;
}
// getterはフィールドの値を取得できるようにするメソッド
public int getCount() {
return count;
}
// setterはメソッドや値を変更するメソッド
public void setCount(int count) {
this.count = count;
}
}
Practice.java
package practice;
public class Practice {
public static void main(String[] args) {
// 「NoCapsule.java」を「Capsule.java」に変更
Capsule eat = new Capsule("ラーメン", 1);
// getterで定義した変数を使用する
System.out.println("好きな食べ物は" + eat.getFood() + "です。");
System.out.println("週に" + eat.getCount() + "回食べています。");
// setterで値を変更
// 引数に変更する値を代入
eat.setCount(2);
System.out.println("最近は週に" + eat.getCount() + "回食べるようになりました。。。");
}
}
実行結果も全く同じになりました。
好きな食べ物はラーメンです。
週に1回食べています。
最近は週に2回食べるようになりました。。。
また、Eclipseでは、下記の箇所からカンタンに自動でカプセル化も可能です!
#参考にさせて頂いた記事