Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.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 如何避免.clone()?_Java_Arrays - Fatal编程技术网

Java 如何避免.clone()?

Java 如何避免.clone()?,java,arrays,Java,Arrays,以这门课为例 class MyClass { private MyData[] data; public MyData[] getData() { return data == null ? null : (MyData[]) data.clone(); } 这是造成问题的原因 安全-方法返回内部数组 直接公开内部数组允许用户修改某些代码 这可能是至关重要的。返回数组的副本更安全 考虑到克隆是不好的,应该避免,我可以做些什么来改进此代码?返回阵列副本的最简单方法可能是调用

以这门课为例

class MyClass {
  private MyData[] data;

  public MyData[] getData() {
    return data == null ? null : (MyData[]) data.clone();
  }
这是造成问题的原因

安全-方法返回内部数组

直接公开内部数组允许用户修改某些代码 这可能是至关重要的。返回数组的副本更安全


考虑到
克隆
是不好的,应该避免,我可以做些什么来改进此代码?

返回阵列副本的最简单方法可能是调用:


我也同意克隆是不好的,但不是在阵列上。克隆在阵列上性能良好。你的代码是干净的。保持原样

很快我会附上乔什·布洛赫在《克隆阵列》中的文字参考

道格·利亚走得更远。他告诉我,除了复制阵列,他不再使用克隆您应该使用克隆来复制阵列,因为这通常是最快的方法。但是Doug的类型不再实现Cloneable。他已经放弃了。我认为这不是不合理的

如果完全避免克隆,下一个最佳选择是

System.arraycopy(array1,0, array2, 0, array1.length);
因为


Arrays.copyOf
在内部创建另一个数组对象,并在System.arraycopy使用传递的数组的位置返回该对象。

只需复制数组?
System.arraycopy
Arrays.copyOf
两者都可以满足您的要求。您在这里试图实现什么?只读数组?否则只返回数据本身。@RalphWiggum,它将返回一个浅拷贝。小心点,这看起来不是什么问题。并不是所有的警告都是问题,它们只是告诉你应该理解你在做什么,并接受你所做的后果。但这不是问题。我会删除任何使用
.clone
的代码,并用正确的代码替换它。@daydreamer在这种情况下
System.arraycopy
是您的朋友。@sᴜʀᴇsʜᴀᴛᴛᴀ
Arrays#copyOf
在后台使用
System.arraycopy
,这更容易调用/理解。
System.arraycopy(array1,0, array2, 0, array1.length);