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

标签 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();
}
}

当然,执行时,测试程序会打印“Long”,然后打印“John”。

如果程序的设计不符合要求,即不希望更改 Foo 的名称,这是否是糟糕的设计?

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

最佳答案

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

如果您的观点主要是为了防止现有对象被修改,您可以将其设置为不可变,即将“name”设为最终值并删除“set”方法。

关于Java:传递给方法时是否应该复制/克隆非文字对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35393011/

相关文章:

java - 如何删除列表中相似的命名字符串?

Java:如何在类内部引用另一个元素的类?

Java Swing Combobox removeAllItems 也调用 ItemStateChanged 吗?

java - 为什么 RowMapper 内部类是静态的?

java - 是否可以在 java 中交换两个数组索引的值?

java - 监听JTable的变化

java - 增加jfreechart中图例中的线条长度

java - 使自定义控件通用

java - 将继承与 JAXB 结合使用

java - ORA-29531 : no method %s in class %s call java source in oracle PLSQL