我有一个类的复制构造函数,但Android Studio代码判断抛出了一个我不理解的警告:

构造函数副本中的可疑赋值

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

将删除警告,但这不是一个选项,因为我需要为字段创建深度副本或克隆.

我是否编写了错误的代码,或者忽略或 suppress 警告是否安全?

推荐答案

这显然是误报.实际上,构造函数没有任何问题.

我认为产生此警告的代码基于this code.请注意,这不是真正的Android Studio代码,但有线索表明Android Studio可能通过某种途径"borrow "了它.

如果你看constructorAssignsAllFields方法(第63行),代码的目的似乎是寻找复制构造函数复制错误字段的代码错误;e、 g.类似这样:

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

Java相关问答推荐

是否有一种格式模式,可以在除0之外的数字前面有正负符号?

Springdoc Whitelabel Error Page with Spring V3

Java模式匹配记录

CAMEL 4中的SAXParseException

滚动视图&不能在alert 对话框中工作(&Q;&Q;)

这是什么Java构造`(InputStream Is)->;()->;{}`

为什么Java编译器不区分不同类型的方法?

如何使用Jackson将XML元素与值和属性一起封装

在JDK 1.8源代码中,为什么使用A-B 0来确定哪个更大,而不是A B?

使用PDFBox从PDF中删除图像

如何在antlr4中跳过所有反斜杠-换行符而保留换行符?

如何使用log4j2(Json)记录由";异常引起的所有";?

解析方法";javax/imageio/metadata/IIOMetadata.getAsTree(Ljava/lang/String;)Lorg/w3c/dom/Node时加载约束冲突

当构造函数创建一个新实例时,Java为什么需要&new";

AWS Java SDK v2.x中没有setObjectAcl方法

URI构造函数错误?

SonarQube在合并升级到java17后对旧代码提出错误

为什么child-pom会创建一个新版本

在JPanel上使用GridBagLayout并将JButton放在里面时出现问题

类型安全:从 JSONArray 到 ArrayList> 的未经判断的转换