3

Findbugs 给了我public GsmSignalStrength clone()以下警告:类定义了 clone() 但没有实现 Cloneable。

为什么我必须实现 Cloneable?是因为浅拷贝和深拷贝吗?我必须为我糟糕的 Java 技能道歉,但我是 Java 新手。

这是我的代码:

class GsmSignalStrength
{
    static final byte SIGNAL_STRENGTH_UNKNOWN = 99;
    static final byte SIGNAL_STRENGTH_1 = 1;
    static final byte SIGNAL_STRENGTH_2 = 2;
    static final byte SIGNAL_STRENGTH_3 = 3;
    static final byte SIGNAL_STRENGTH_4 = 4;
    static final byte SIGNAL_STRENGTH_5 = 5;

    /* Constructors */

    GsmSignalStrength(byte signalStrength)
    {
        initClassVars(signalStrength);
    }

    GsmSignalStrength()
    {
        initClassVars(SIGNAL_STRENGTH_UNKNOWN);
    }

    GsmSignalStrength(byte[] serializedData, IntClass deserializationIndex)
    {
        initClassVars(SIGNAL_STRENGTH_UNKNOWN);
        setClassProperties(serializedData, deserializationIndex);
    }

    byte value;

    /* Methods */

    public void copyTo(GsmSignalStrength destination)
    {
        destination.value = this.value;
    }

    public GsmSignalStrength clone()
    {
        GsmSignalStrength clonedValue = new GsmSignalStrength();

        this.copyTo(clonedValue);

        return clonedValue;
    }

    private void initClassVars(byte signalStrength)
    {
        this.value = signalStrength;
    }
}
4

3 回答 3

3

您可以阅读文档

一个类实现了 Cloneable 接口,以向 Object.clone() 方法指示该方法可以合法地对该类的实例进行逐个字段的复制。

在未实现 Cloneable 接口的实例上调用 Object 的 clone 方法会导致抛出异常 CloneNotSupportedException。

但是,您没有以clone()正确的方式使用方法。看看这个维基页面

于 2012-04-11T11:49:54.177 回答
3

Cloneable这里不需要

这是因为您的实现clone()实际上并没有克隆对象。在 Java 中,克隆的具体含义是使用Object.clone()JVM 来复制对象。虽然您的代码做了一些相当于克隆的事情(更好的是,恕我直言——它避免使用魔法),但它不是真正的克隆。

但是,不知道这一点,因此它担心您可能会尝试克隆非Cloneable对象。

这里的一种解决方案可能是将您的方法重命名为其他名称(copy()?),因此它似乎不是克隆。

于 2012-04-11T12:32:57.437 回答
1

如果您将克隆实现为

public GsmSignalStrength clone()
{
    try{
    GsmSignalStrength clonedValue = (GsmSignalStrength )super.clone();

    this.copyTo(clonedValue);
    return clonedValue;
    }catch(CloneNotSupportedException e){thrown new RunTimeException(e);}

}

(如果您要继承 GsmSignalStrength 子类,则需要根据Object.clone()的文档进行)

super.clone 调用将引发 CloneNotSupportedException

于 2012-04-11T11:55:24.433 回答