Java:传递给方法时,是否应复制/克隆非文字对象

时间:2016-02-14 14:44:50

标签: java

请考虑以下事项:

public class Foo {

private String name;

public Foo(String name) {
this.name = name;
}

public String get() {
return name;
}

public void set(String name) {
this.name = name;
}
}

import java.util.ArrayList;

容器类:

public class FooContainer {

private ArrayList<Foo> foos;

public FooContainer(int nbrOfFoos) {
foos = new ArrayList<Foo>(nbrOfFoos);
}

public void add(Foo foo) {
foos.add(foo);
}

public void printFoos() {
for(Foo foo: foos) {
    System.out.println(foo.get());
}
}
}

一个简单的测试:

public class FooTest {

public static void main(String[] args) {

Foo foo = new Foo("Long");
FooContainer cont = new FooContainer(1);
cont.add(foo);
cont.printFoos();
foo.set("John");
cont.printFoos();
}
}

当然,执行时,测试程序会打印&#34; Long&#34;然后&#34; John&#34;。

设计一个不合适的程序是不好的设计,即人们不希望改变Foo的名字?

传递给add方法时,复制/克隆对象的唯一解决方法是什么?

2 个答案:

答案 0 :(得分:3)

这就是Java的工作方式:对象作为参考而不是作为副本传递。在大多数情况下,这似乎是有道理的。复制对象可能很昂贵。如果要将副本放入容器中,则需要显式创建新对象 - 我不认为这是一种解决方法。

如果您的观点主要是防止现有对象被修改,那么您可以将其变为不可变对象,即制作名称&#39;最终并删除&#39;设置&#39;方法

答案 1 :(得分:0)

为了澄清,Java总是将参数作为值传递。当Java传递副本时会出现误解,因此看起来对象是通过引用传递的。

阅读此问题以了解详情:Is Java "pass-by-reference" or "pass-by-value"?