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文档。我不想使用列表。仍然要返回字符串[]。然后需要进行防御性复制。我不想使用列表。仍然要返回字符串[]。然后需要进行防御性复制。