我怎样才能使这个对象可变
How can I make this object mutable
我有这个简单的不可变对象:
public class Alt {
public LinkedList<Integer> list = new LinkedList<Integer>();
public void refresh() {
Random rand = new Random();
list.clear();
for (int i = 0; i < 50; i++) {
list.add(rand.nextInt(32));
}
}
public void compare(Alt alt) {
for (int i = 0; i < list.size(); i++) {
System.out.println(alt.list.get(i) + " " + list.get(i));
}
}
}
但是这个 class 是一个不可变的对象,例如当我 运行:
Alt a = new Alt();
a.refresh();
Alt b = a;
b.refresh();
a.compare(b);
return的值相同,对象b就像是对象a的快捷方式,或多或少是一个副本。有没有办法使 b 分开?还是我这样做的方式完全错误。
你的术语是错误的。这不是一个不可变的对象。 refresh()
方法修改对象。在下面的代码中会输出两条不同的线:
Alt a = new Alt();
a.refresh();
System.out.println(a.list);
a.refresh();
System.out.println(a.list);
另外,因为字段list
在class之外是可见的,所以可以直接修改:
Alt a = new Alt();
a.refresh();
System.out.println(a.list);
a.list.set(10, 42);
System.out.println(a.list);
您观察到的行为是由于 a = b
没有创建对象的新副本。它只会使 reference b
指向与引用 a
相同的对象。由于只有一个对象,a.compare(b)
将打印相同的数字两次。
要复制对象,您必须自己编写程序。在Java中,这通常是由所谓的复制构造函数:
完成的
public Alt(Alt original) {
list = new LinkedList<>(original.list);
}
(请注意该复制构造函数如何调用 LinkedList
的复制构造函数,从而生成列表的副本。)
现在你可以写:
b = new Alt(a);
然后 b
将是对恰好包含相同数据的新对象的引用。
你的问题有误会。首先,您的 class 实际上是可变的。您可以阅读 here 关于定义不可变对象的策略。
其次,您提到的观察到的行为是由于引用传递造成的。您可以阅读更多信息 here.
我有这个简单的不可变对象:
public class Alt {
public LinkedList<Integer> list = new LinkedList<Integer>();
public void refresh() {
Random rand = new Random();
list.clear();
for (int i = 0; i < 50; i++) {
list.add(rand.nextInt(32));
}
}
public void compare(Alt alt) {
for (int i = 0; i < list.size(); i++) {
System.out.println(alt.list.get(i) + " " + list.get(i));
}
}
}
但是这个 class 是一个不可变的对象,例如当我 运行:
Alt a = new Alt();
a.refresh();
Alt b = a;
b.refresh();
a.compare(b);
return的值相同,对象b就像是对象a的快捷方式,或多或少是一个副本。有没有办法使 b 分开?还是我这样做的方式完全错误。
你的术语是错误的。这不是一个不可变的对象。 refresh()
方法修改对象。在下面的代码中会输出两条不同的线:
Alt a = new Alt();
a.refresh();
System.out.println(a.list);
a.refresh();
System.out.println(a.list);
另外,因为字段list
在class之外是可见的,所以可以直接修改:
Alt a = new Alt();
a.refresh();
System.out.println(a.list);
a.list.set(10, 42);
System.out.println(a.list);
您观察到的行为是由于 a = b
没有创建对象的新副本。它只会使 reference b
指向与引用 a
相同的对象。由于只有一个对象,a.compare(b)
将打印相同的数字两次。
要复制对象,您必须自己编写程序。在Java中,这通常是由所谓的复制构造函数:
完成的public Alt(Alt original) {
list = new LinkedList<>(original.list);
}
(请注意该复制构造函数如何调用 LinkedList
的复制构造函数,从而生成列表的副本。)
现在你可以写:
b = new Alt(a);
然后 b
将是对恰好包含相同数据的新对象的引用。
你的问题有误会。首先,您的 class 实际上是可变的。您可以阅读 here 关于定义不可变对象的策略。
其次,您提到的观察到的行为是由于引用传递造成的。您可以阅读更多信息 here.