gpt4 book ai didi

java - 为什么这些 Java 枚举会改变值?

转载 作者:行者123 更新时间:2023-12-04 06:51:52 25 4
gpt4 key购买 nike

我在根据 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 实例发生变化,以及我如何制作一个不变的列表,我将不胜感激。

编辑: 好的,我现在知道问题出在哪里了。在实际的、更大的程序中,我有一个更大的数组,我想在为列表创建新的 Foo 时保留旧信息。我更改了代码以反射(reflect)我想要维护的附加信息。我该如何实现?

EDIT 2021: 十二年后徘徊在这个问题上,这是我的第一个 SO 问题。如果这对你有帮助,我很高兴。如果您想知道我到底想做什么,答案是“我不知道”。

最佳答案

这个位是罪魁祸首:

Foo(Foo old, Digit num) {
this.array = old.array;
array[0] = num;
}

您正在复制对旧 Foo 数组的引用,然后更改该数组中的值。

为什么你甚至有一个大小为 1 的数组而不只是一个 Digit?如果你真的想要这个数组,你可能想要克隆它而不是仅仅复制引用,但我们无法真正说出意图是什么。

这是一个较短的例子:

enum Digit { ZERO, ONE, TWO, THREE, FOUR, FIVE }

public class Foo {
Digit[] array = new Digit[1];

Foo() {
array[0] = Digit.ZERO;
}

Foo(Foo old, Digit num) {
this.array = old.array;
array[0] = num;
}

public String toString() {
return array[0].toString();
}

public static void main(String[] args) {
Foo f = new Foo();
System.out.println(f);
Foo other = new Foo(f, Digit.ONE);
System.out.println(f);
}
}

关于java - 为什么这些 Java 枚举会改变值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1171698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com