カプセル化
Java練習問題 第12回では「カプセル化」についての問題を用意してあります。
「カプセル化」の解説はこちら
問題 1 難易度 ★★★
ペット犬育成アプリケーションを作成しています。
下記のコードを実行すると、体重がマイナスの数値になる不具合が発生しました。
不具合対策として、Dog クラスのメンバに、カプセル化とアクセサメソッド(getter、setter)の記述を追加し、年齢は 0 以上、体重は 1.0~100.0 の範囲に収まるようにしてください。
public class Main_0801 {
public static void main(String[] args) {
// Dog インスタンスを生成します。
Dog dog = new Dog("pochi");
dog.showStates();
// 健康管理のため 1.5kg 減量しようと、weight 変数に数値を代入。
dog.weight -= 1.5d;
dog.showStates();
}
}
class Dog {
String name;
int age = 0;
double weight = 1.0d;
Dog(String name) {
this.name = name;
age = 0;
weight = 1.0d;
System.out.println("子犬が誕生しました!");
}
void showStates() {
System.out.println("名前:" + name);
System.out.println("年齢:" + age);
System.out.println("体重:" + weight);
System.out.println();
}
}
実行例
子犬が誕生しました!
名前:pochi
年齢:0
体重:1.0
不正な体重設定です。体重の変更は行われませんでした。
名前:pochi
年齢:0
体重:1.0
問題 1 解答
正解は、、、
public class Main_0801 {
public static void main(String[] args) {
// Dog インスタンスを生成します。
Dog dog = new Dog("pochi");
dog.showStates();
// 健康管理のため 1.5kg 減量しようと、weight 変数に数値を代入。
//dog.weight -= 1.5d; //訂正前
dog.setWeight(dog.getWeight() - 1.5); //訂正後
dog.showStates();
}
}
//解答例
class Dog {
private String name;
private int age = 0;
private double weight = 1.0d;
Dog(String name) {
this.name = name;
age = 0;
weight = 1.0d;
System.out.println("子犬が誕生しました!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age < 0) {
System.out.println("年齢を 0 未満にはできません。");
} else {
this.age = age;
}
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
if (weight < 1.0 || weight > 100.0) {
System.out.println("不正な体重設定です。体重の変更は行われませんでした");
} else {
this.weight = weight;
}
}
public void showStates() {
System.out.println("名前:" + name);
System.out.println("年齢:" + age);
System.out.println("体重:" + weight);
System.out.println();
}
}
問題 2 難易度 ★★★
以下のプログラムには、名前の文字数が不正な場合にも動作してしまうという不具合があります。
Student クラスに適切なカプセル化と、アクセサメソッド(getter、setter)の追加を行い、
不正な入力を防ぐことができるように修正してください。
public class Main_0802 {
public static void main(String[] args) {
Student[] students = new Student[3];
for (int i = 0; i < students.length; i++) {
System.out.println((i + 1)+"番目の生徒の名前を、2~12 文字で入力してください。");
String name = new java.util.Scanner(System.in).next();
students[i] = new Student();
students[i].number = i + 1;
students[i].name = name;
}
//生徒一覧出力
System.out.println("\n**生徒一覧**");
System.out.println("no\t:name");
System.out.println("----------------------");
for (int i = 0; i < students.length; i++) {
System.out.println(students[i].number + "\t:" + students[i].name);
}
}
}
class Student {
int number;
String name;
}
実行例
① 番目の生徒の名前を、2~12 文字で入力してください。
山田太郎
② 番目の生徒の名前を、2~12 文字で入力してください。
あ
③ 番目の生徒の名前を、2~12 文字で入力してください。
佐藤花子
**生徒一覧**
no :name
——————————
1 :山田太郎
2 :エラー::入力された文字数が不正です
3 :佐藤花子
問題 2 解答
正解は、、、
public class Main_0802_answer {
public static void main(String[] args) {
Student2[] students = new Student2[3];
for (int i = 0; i < students.length; i++) {
System.out.println((i + 1) + "番目の生徒の名前を、2~12 文字で入力してください。");
String name = new java.util.Scanner(System.in).next();
students[i] = new Student2();
students[i].setNumber(i + 1);
students[i].setName(name);
}
//生徒一覧出力
System.out.println("\n**生徒一覧**");
System.out.println("no\t:name");
System.out.println("----------------------");
for (int i = 0; i < students.length; i++) {
System.out.println(
students[i].getNumber() + "\t:" + students[i].getName());
}
}
}
class Student2 {
private int number;
private String name;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
if (2 <= name.length() && name.length() <= 12) {
this.name = name;
} else {
this.name = "エラー::入力された文字数が不正です";
}
}
}
Java練習問題 第13回では「継承」から出題します。
コメント