私はコレクション内の要素を新しい修正版に置き換えようとしています。以下は私が達成したいことを実証することを目的とする短いコードです。Javaコレクションのオブジェクトを置き換えるにはどうしたらいいですか?
全体的なアイデアは、私は他のオブジェクトのコレクションで構成されて一つのオブジェクトを持っているということです。ある時点では、コレクションのこのオブジェクト(私の電話機の場合)にいくつかの変更が必要な場合があり、コードを1か所だけ変更したいと思っています。
私は、以下に示すようコレクションを反復しながら、オブジェクトの属性を更新するために、私はセッターを使用することができることを知っています。しかし、おそらくそれを達成するためのより良い、より一般的な方法があります。
public class Customer {
private int id;
private Collection<Phone> phoneCollection;
public Customer() {
phoneCollection = new ArrayList<>();
}
//getters and setters
}
と電話クラス
public class Phone {
private int id;
private String number;
private String name;
//getters and setters
}
と
public static void main(String[] args) {
Customer c = new Customer();
c.addPhone(new Phone(1, "12345", "aaa"));
c.addPhone(new Phone(2, "34567", "bbb"));
System.out.println(c);
Phone p = new Phone(2, "9999999", "new name");
Collection<Phone> col = c.getPhoneCollection();
for (Phone phone : col) {
if (phone.getId() == p.getId()) {
// This is working fine
// phone.setNumber(p.getNumber());
// phone.setName(p.getName());
// But I'd like to replace whole object if possible and this is not working, at least not that way
phone = p;
}
}
System.out.println(c);
}
}
これは私が欲しいものを達成することは可能ですか? 私はコピーコンストラクタのアイデアと私はネットを検索見つかった他の方法を試してみましたが、私が期待するようにそれらのどれも働いていませんでした。
EDIT 1
いくつかのコメントを読んだ後、私は
が、私は自分の携帯電話のクラスに次のメソッドを追加したアイデアを得たpublic static void replace(Phone org, Phone dst){
org.setName(dst.getName());
org.setNumber(dst.getNumber());
}
、今の私のforeach部分はその
のように見えますfor (Phone phone : col) {
if (phone.getId() == p.getId()) {
Phone.replace(phone, p);
}
}
と私仕事をしません。 Phoneクラスの属性を変更すると、そのメソッドを変更するだけで済みます。そうした問題を解決することは問題ないと思いますか?代わりに、リストの
いいえ、これはできません。コレクションが変更不可能な場合、そのコレクションはどのように機能すると思いますか? –
'foreach'が読み取り専用のループで、' phone'への参照を変更できないので、うまく動作しませんでした – Andrew