Java 当构造函数中的局部变量和实例变量相同时,调用clone()是否是一个好选项 X类{ 私有字符串[]文件名; 公共X(字符串[]文件名){ this.filename=filename.clone(); } }

Java 当构造函数中的局部变量和实例变量相同时,调用clone()是否是一个好选项 X类{ 私有字符串[]文件名; 公共X(字符串[]文件名){ this.filename=filename.clone(); } },java,Java,当构造函数中的局部变量和实例变量相同时,调用clone()是一个不错的选择。这取决于您实际想要实现什么。由于参数filename实际上是调用方创建的对象的引用,因此调用new X(filename)的任何人都会引用filename数组,并可以进一步修改它 1) 如果您不介意您无法控制的代码可以更改数组,您可以只分配this.filename=filename 2) 如果您想确保没有其他代码会弄乱您的数组,那么克隆就有帮助了。保持在中间,尽管新阵列仍将保持对原始阵列中相同对象的崇敬。因此,如果数组

当构造函数中的局部变量和实例变量相同时,调用clone()是一个不错的选择。

这取决于您实际想要实现什么。由于参数
filename
实际上是调用方创建的对象的引用,因此调用
new X(filename)
的任何人都会引用
filename
数组,并可以进一步修改它


1) 如果您不介意您无法控制的代码可以更改数组,您可以只分配
this.filename=filename

2) 如果您想确保没有其他代码会弄乱您的数组,那么克隆就有帮助了。保持在中间,尽管新阵列仍将保持对原始阵列中相同对象的崇敬。因此,如果数组元素是可变的,则不会有多大帮助。例如,如果您使用的是
Foo[]
而不是
String[]
,那么引用任何给定
Foo
的人可以在您的控制之外对其进行修改


3) 如果您决定使用单元素数组而不是
String
,只是因为数组具有
clone
方法,那么您的方法不会给您带来任何好处

你说的相同是什么意思?同一个对象实例?你从中获得了什么?参数可以直接分配给类变量!你应该明白这根本没有影响。是的,它们有相同的名称,但只有当您通过(this.)引用使用它们时,它才是实例变量。与其他选项相比,它没有优劣之分。(事实上,您的字段名和局部变量名是相同的,这没有什么区别。为什么会这样呢?)这就是这个
运算符的原因之一。。。如果变量名不明确,可以通过
this
(如果其中一个是类属性,另一个是参数)进行区分:
this.filename=filename,不需要克隆…“参数是通过引用传递的”-这在Java上下文中有点不准确只是这些值本身就是引用。我并不是说爪哇是“通过引用传递的”。但我知道我的答案会被误解,所以我更新了它。希望现在更清楚了。谢谢你指出这一点。对我来说这看起来更好:-)如果你不介意你控制之外的代码可以更改数组,你可以只分配这个。filename=filename。-如果我选择这个选项,它会在声纳中显示1个漏洞。