初心者です。JavaのListについて教えてください。
解決したいこと
現在、大学でJavaのリストについて学んでいるのですが、
課題でつまずいてしまい、助けていただきたく質問を投稿しました。
【やりたいこと】
1)Sample1クラスにObjectを定義
2)Sample2のメソッドを通じて、Sample3のリストに1)のObjectを渡す(追加する)
以上を通じて、Sample3内のリストを以下のようにアップデートしようとしています。
名前, 価格, 数量
[1] "芋", 200, 20
[2] "トマト", 100, 10
[3] "牛肉", 1000, 5
.
.
.
以下にサンプルコードを乗せていますが、
この内容で実行すると、Mainクラスに記載の<1>, <2>、
それぞれ以下の挙動になります。
<1> "芋", 200, 20 //正しく出力されます。
<2> IndexOutOfBoundsException //リストが作成されていないようです。
ゴールとしてはSample3のリストの内容自体を変えたいので、
<2>の結果と<1>の結果が一致するようにしたいです。
Sample2のGetter経由であればリストにObjectの追加ができているのに、
Sample3から直接リストを取り出そうとすると何も追加されていないのが
何故なのか自力ではわからず、、
原因と、何か良い解決策があれば教えていただけますでしょうか。
以下の様なクラス構成にすることや、Attributeをprivateにすることなど、
構成面は変えない前提でアドバイスを頂けますと幸いです。
初歩的なことで申し訳ありませんが、どうぞよろしくお願い致します。
サンプルコード
//追加したいObjectの形式を定義したクラス
class Sample1 {
private String name;
private int price;
private int qty;
//constructor
Sample1 (String name, int price, int qty) {
this.name = name;
this.price = price;
this.qty = qty;
}
//getter
public String getName() {
return name;
}
public int getPrice() {
return price;
}
public int getQty() {
return qty;
}
}
//Objectを渡すメソッドを含むクラス
class Sample2 {
private Sample3 sample3;
//constructor
public Sample2() {
sample3 = new Sample3();
}
//getter
public Sample3 getSample3() {
return sample3;
}
//新しいObjectをSample 3に追加するメソッド
public void addition(String name, int price, int qty) {
//新しいSample1 objectの呼び出し
Sample1 s1 = new Sample1(name, price, qty);
//Sample3のリストへのObject追加
sample3.setSample3(s1);
}
}
//Objectを追加していくリストを含むクラス
class Sample3 {
//Sample1のObjectで構成されるリストを定義
private List<Sample1> targetList;
//constructor(リストの初期化)
public Sample3() {
targetList = new ArrayList<>();
}
//getter
public List<Sample1> getTargetList() {
return targetList;
}
//setter(sample1をSample2から受け取って、リストに追加するようにしている)
public void setSample3(Sample1 sample1) {
this.targetList.add(sample1);
}
}
public class Main {
public static void main(String[] args){
Sample2 s2 = new Sample2();
Sample3 s3 = new Sample3();
s2.addition("芋", 200, 20);
s2.addition("トマト", 100, 10);
s2.addition("牛肉", 1000, 5);
//<1> Sample2からGetter経由で一つ目のObjectを出力した場合
System.out.println(s2.getSample3().getTargetList().get(0).getName());
System.out.println(s2.getSample3().getTargetList().get(0).getPrice());
System.out.println(s2.getSample3().getTargetList().get(0).getQty());
//<2> Sample3から直接一つ目のObjectを出力した場合
System.out.println(s3.getTargetList().get(0).getName());
System.out.println(s3.getTargetList().get(0).getPrice());
System.out.println(s3.getTargetList().get(0).getQty());
}
}