字节[]的“复制构造函数中的可疑赋值”-什么是可疑的?

cbeh67ev  于 2022-10-22  发布在  Java
关注(0)|答案(2)|浏览(109)

我有一个类的复制构造函数,但Android Studio代码检查抛出了一个我不明白的警告:
“java.util.Arrays.copyOf(other.value,other.value.length)”复制构造函数中的字段值赋值可疑

public class CpuVariable extends BaseIdentifier {
    private int memoryType;
    private byte[] value;

    public CpuVariable(@NonNull CpuVariable other) {
        super(other);
        this.memoryType = other.memoryType;
        if (other.value != null) {
            this.value = java.util.Arrays.copyOf(other.value, other.value.length);
        }
    }
}

将代码更改为

this.value = other.value

将删除警告,但这不是一个选项,因为我需要为字段创建深度副本或克隆。
我是否编码错误,或者忽略或抑制警告是否安全?

xxhby3vn

xxhby3vn1#

这显然是一个误报。你的构造函数实际上没有什么问题。
我认为产生此警告的代码基于this code。请注意,这不是真正的Android Studio代码,但有线索表明Android Studio可能通过某种途径“借用”了它。
如果您查看constructorAssignsAllFields方法(第63行),代码的目的似乎是查找复制构造函数复制错误字段的代码错误;e、 例如:

MyClass(MyClass other) {
   this.x = other.x;
   this.y = other.x; // Ooops
}

但该方法不能正确处理复制构造函数正在转换其中一个字段的情况。
查看代码,您需要以一种方式编写this.value =,使检查器不会意识到它正在分配给字段。例如,如果您使用了类似这样的setter方法:

public CpuVariable(@NonNull CpuVariable other) {
    super(other);
    this.memoryType = other.memoryType;
    this.value = other.value;  // Dummy
    if (other.value != null) {
        this.setValue(java.util.Arrays.copyOf(other.value, other.value.length));
    }
}
5cnsuln7

5cnsuln72#

如果复制构造函数有任何其他问题,比如复制构造函数没有复制所有字段,那么这种情况似乎也会发生。在这种情况下,我在IntelliJ中也看到了同样的错误。

相关问题