Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串[]指向VO对象中的同一引用_Java_Reference_Arrays - Fatal编程技术网

Java 字符串[]指向VO对象中的同一引用

Java 字符串[]指向VO对象中的同一引用,java,reference,arrays,Java,Reference,Arrays,考虑以下两个类(一个是带有Main()方法的Main): VO类: 主类: 执行后的结果: 再见,世界 问题: 我知道vale数组变量引用的是构造函数中解析的同一个变量,如果我更改数组中的一个索引,它将更改VO中相同的String[] 如何“修复”或更改TheVO类,使结果为: 你好,世界 您需要使用防御性复制:复制构造函数中的字符串[]。这可以确保参数在传递给VO类后不会被修改。然后复制getter中的字符串[],以避免getter的调用者修改内部字符串[]。复制阵列的最简单方法是调用clon

考虑以下两个类(一个是带有
Main()
方法的
Main
):

VO类:

主类:

执行后的结果:

再见,世界

问题:

我知道
vale
数组变量引用的是构造函数中解析的同一个变量,如果我更改数组中的一个索引,它将更改VO中相同的
String[]

如何“修复”或更改TheVO类,使结果为:


你好,世界

您需要使用防御性复制:复制构造函数中的
字符串[]
。这可以确保参数在传递给VO类后不会被修改。然后复制getter中的
字符串[]
,以避免getter的调用者修改内部
字符串[]
。复制阵列的最简单方法是调用
clone

this.theValues = theParam.clone();
如果使用集合而不是数组,则可以通过使用(这是一种更便宜的操作)包装集合,从而消除getter中的防御副本:

私有列表值;
公共列表getValues(){
返回集合.unmodifiableList(this.theValues);
}

不过,您仍然需要构造函数中的防御性副本。

您需要使用防御性副本:在构造函数中复制
字符串[]
。这可以确保参数在传递给VO类后不会被修改。然后复制getter中的
字符串[]
,以避免getter的调用者修改内部
字符串[]
。复制阵列的最简单方法是调用
clone

this.theValues = theParam.clone();
如果使用集合而不是数组,则可以通过使用(这是一种更便宜的操作)包装集合,从而消除getter中的防御副本:

私有列表值;
公共列表getValues(){
返回集合.unmodifiableList(this.theValues);
}
不过,您仍然需要构造函数中的防御性副本。

您可以在getValues()方法中复制(或克隆)字符串[]

这样,通过创建一个新数组,您就失去了字符串数组之间的耦合。

您可以在getValues()方法中复制(或克隆)字符串[]


这样,通过创建一个新数组,您就失去了字符串数组之间的耦合。

您可以尝试更改getValues();方法返回vo.theValues数组的副本,而不是对原始数组的引用。

您可以尝试更改getValues();方法返回vo.theValues数组的副本,而不是对原始数组的引用。

我建议在从
TheVO.getValues()返回时执行内部数组的副本。
。如果您运行的是Java 1.6,则可以利用
Arrays.copyOf()
方法

public String[] getValues() {
    return Arrays.copyOf(theValues, theValues.length);
}

请注意,访问此处的实例字段不需要使用
this

我建议在从
vo.getValues()返回时执行内部数组的副本。如果您运行的是Java 1.6,则可以利用
Arrays.copyOf()
方法

public String[] getValues() {
    return Arrays.copyOf(theValues, theValues.length);
}

请注意,无需使用
this
来访问此处的实例字段。

在VO构造函数中创建数组的副本

在VO构造函数中创建数组的副本

更改getValues()方法以克隆数组

像这样的

public String[] getValues(){
    return this.theValues.clone();
}
更改getValues()方法以克隆阵列

像这样的

public String[] getValues(){
    return this.theValues.clone();
}

如果你是指克隆()。不起作用。实例变量设置为克隆,该克隆也在主类中设置。到目前为止,似乎唯一有效的方法是getValues()方法中的clone()。不-不是clone-System.arrayCopy()-记不起我头顶的参数,但它获取源数组的一个副本,而不仅仅是对它的引用的副本。
System.arrayCopy()
确实是复制阵列的首选/唯一1.6版本之前的方法。有关更多详细信息,请参阅的API文档。如果您是指clone()。不起作用。实例变量设置为克隆,该克隆也在主类中设置。到目前为止,似乎唯一有效的方法是getValues()方法中的clone()。不-不是clone-System.arrayCopy()-记不起我头顶的参数,但它获取源数组的一个副本,而不仅仅是对它的引用的副本。
System.arrayCopy()
确实是复制阵列的首选/唯一1.6版本之前的方法。有关更多详细信息,请参阅的API文档。我不想使用列表。仍然要返回字符串[]。然后需要进行防御性复制。我不想使用列表。仍然要返回字符串[]。然后需要进行防御性复制。