例如我有这个构造函数
public Example(byte[] bytes) {
this.bytes = bytes;
}
运行 FindBugs 后,它会说我应该考虑克隆它......所以我尝试了,它消除了警告。
public Example(byte[] bytes) {
this.bytes = bytes.clone();
}
但是,我想知道这种变化是否有任何影响或负面副作用。据我了解,它也适用于所有数组,而不仅仅是 byte[]。
谢谢
最佳答案
可能的错误是,如果您在实例中重用数组,您将把它与调用代码结合起来,即对数组所做的每个更改(但在该类之外)都可能会产生副作用。
示例:
char[] chars = new char[]{ 'a', 'b', 'c', ..., 'z' };
Alphabet lower = new Alphabet( chars );
for( int i = 0; i < chars.length; i++ ) {
chars[i] = Character.toUpperCase( chars[i] );
}
Alphabet upper = new Alphabet( chars );
如果数组在 Alphabet
内重用(即未克隆),您可能会认为 lower
处理小写字符,而实际上它使用的是元素已被替换的数组及其大写对应部分。
因此,在大多数情况下,创建数组的副本更安全,例如通过对其调用 clone()
(还有其他方法)。
这样做的缺点是增加了内存使用量(当然)以及执行复制时的一些性能成本 - 对于一些小型数组来说,这两者可能可以忽略不计,但当数组的大小和/或数量增加时,这两者都会增加。
另一个缺点可能是调用代码可能期望数组被共享,而创建克隆可能会破坏这一点。您还必须检查这一点。
关于java - Findbugs通过参数或clone()分配字节数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38071779/