enum
の条件に基づいてオブジェクトのリストを作成するのに問題があります。私はリストを完成した後、リストのすべてのアイテムは最後のアイテムと同等であるようです。これらのJava enumが値を変更するのはなぜですか?
それは同じオブジェクトを指して異なる参照の古典的なケースだが、私はそれを回避する方法がわからない:
可読性維持しながら、私は私ができる限りの事を下に切り詰めました:
をここでpublic class Foo {
Digit[] array = new Digit[2];
ArrayList<Foo> foozlets;
Foo() {
array[0] = Digit.ZERO;
foozlets = new ArrayList<Foo>();
}
Foo(Foo old, Digit num) {
this.array = old.array; \\This line is a problem, what should it say?
array[1] = num;
}
public static void main(String[] args) {
Foo f = new Foo();
System.out.println("Initial Foo:");
System.out.println(f);
f.listFoozlets();
}
void listFoozlets() {
for (Digit k : Digit.values()) {
if (k == Digit.TWO || k == Digit.FIVE) {
foozlets.add(new Foo(this, k));
System.out.println("** Foozlet being added **");
Foo foo = new Foo(this, k);
System.out.println(foo);
}
}
System.out.println("** List of Foozlets **");
for (Foo foo : foozlets) {
System.out.println(foo);
}
}
public String toString() {
return array[0].toString() + " " + array[1].toString();
}
}
enum Digit { ZERO, ONE, TWO, THREE, FOUR, FIVE }
が出力されます。
Initial Foo:
ZERO NULL
** Foozlet being added **
ZERO TWO
** Foozlet being added **
ZERO FIVE
** List of Foozlets **
ZERO FIVE
ZERO FIVE
誰かがリストの変更にFoo
の理由最初のインスタンスを説明することができ、そしてどのように私が作ることができる場合変更されないリスト、私は感謝します。
編集: [OK]をクリックして、問題の原因を確認します。実際のはるかに大きなプログラムでは、私ははるかに大きな配列を持っています。リストのために新しいFooを作成するときに古い情報を保持したいのです。私は、維持したい追加の情報があることを反映するようにコードを変更しました。これをどのように達成するのですか?
あなたの編集については、明白な答え配列をクローンすることです(Jonと私の答えが示唆するように)。配列が非常に大きい場合、古いデータと新しいデータとの関係は何ですか?これを達成するためには、別のデータ構造が必要かもしれませんが、保存されているデータと古いFoosと新しいFoosの関係についての洞察がないので、私は良い提案はできません。 – Yishai