Ich habe einige Probleme mit der Erstellung einer Liste von Objekten basierend auf einer Bedingung auf einem enum
. Es scheint, dass, nachdem ich die Liste abgeschlossen habe, jedes Element in der Liste dem letzten Element entspricht.Warum ändern diese Java-Enums Werte?
Es ist der klassische Fall von verschiedenen Referenzen auf das gleiche Objekt zeigen, aber ich weiß nicht, wie es zu vermeiden:
ich Dinge verglichen habe, so viel wie ich kann, während die Lesbarkeit beibehalten:
Hierpublic 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 }
ist die Ausgabe:
Initial Foo:
ZERO NULL
** Foozlet being added **
ZERO TWO
** Foozlet being added **
ZERO FIVE
** List of Foozlets **
ZERO FIVE
ZERO FIVE
Wenn jemand erklären kann, warum die erste Instanz von Foo
auf der Liste ändert, und wie ich machen kann Liste, die sich nicht ändert, wäre ich dankbar.
EDIT: Ok, ich sehe, wo das Problem jetzt ist. Im realen, viel größeren Programm habe ich ein viel größeres Array, und ich möchte die alten Informationen behalten, wenn ich ein neues Foo für die Liste erstelle. Ich habe den Code geändert, um anzuzeigen, dass weitere Informationen vorhanden sind, die ich beibehalten möchte. Wie erreiche ich das?
In Bezug auf Ihre Bearbeitung, müssen Sie genauer über Ihren Fall, als die offensichtliche Antwort bekommen ist, das Array zu klonen (wie Jon und meine Antwort vermuten). Wenn das Array sehr groß ist, wie ist dann die Beziehung zwischen den alten und den neuen Daten? Möglicherweise benötigen Sie für diesen Zweck eine andere Datenstruktur, aber da wir keinen Einblick in die gespeicherten Daten haben und wie alt und neu Foos sind, kann ich keine guten Vorschläge machen. – Yishai