首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这里需要Cloneable吗?

这里需要Cloneable吗?
EN

Stack Overflow用户
提问于 2012-04-11 19:48:23
回答 3查看 1.2K关注 0票数 3

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

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

下面是我的代码:

代码语言:javascript
复制
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;
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-11 20:32:57

这里不需要Cloneable

这是因为您的clone()实现实际上并不克隆对象。在Java语言中,克隆特别意味着使用Object.clone(),它使用JVM魔术来复制对象。虽然你的代码做了一些类似于克隆的事情(更好的是,我想--它避免了使用魔法),但它不是真正的克隆。

但是,findbugs并不知道这一点,所以它担心您可能正在尝试克隆一个非Cloneable对象。

这里的一种解决方案可能是将您的方法重命名为其他名称(copy()?),这样它就看起来不像是克隆方法。

票数 3
EN

Stack Overflow用户

发布于 2012-04-11 19:49:54

您可以阅读documentation

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

在没有实现Cloneable接口的实例上调用对象的克隆方法会导致抛出异常CloneNotSupportedException。

但是,您没有以正确的方式使用clone()方法。看看这个wiki page

票数 3
EN

Stack Overflow用户

发布于 2012-04-11 19:55:24

如果将克隆实现为

代码语言:javascript
复制
public GsmSignalStrength clone()
{
    try{
    GsmSignalStrength clonedValue = (GsmSignalStrength )super.clone();

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

}

(根据Object.clone()的文档,如果您要创建GsmSignalStrength的子类,则需要使用它)

super.clone调用将抛出一个CloneNotSupportedException

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10105292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档