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);