java - Findbugs通过参数或clone()分配字节数组值

标签 java arrays findbugs

例如我有这个构造函数

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/

相关文章:

java - Retrofit 中 RSS 提要解析期间的 ValueRequiredException

java - 如何在没有HQL的情况下在Hibernate中执行普通的SQL查询?

c# - int.TryParse 输出到一个对象数组

java - FindBugs 和静态初始化顺序

gradle - 在 Gradle 的 FindBugs 插件中使用 fb-contrib 库

java - Spring @Transactional方法——参与事务

java - 如何将变量的数据与数组中的数据进行比较?

java - 可编辑的二维数组

ruby - 按内容计算的最大值对数组排序

java - SpotBugs "No value has been specified for property ' SpotbugsClasspath'"