Findbugs给了我以下关于克隆的警告:类定义了public GsmSignalStrength 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;
}
}发布于 2012-04-11 20:32:57
这里不需要Cloneable。
这是因为您的clone()实现实际上并不克隆对象。在Java语言中,克隆特别意味着使用Object.clone(),它使用JVM魔术来复制对象。虽然你的代码做了一些类似于克隆的事情(更好的是,我想--它避免了使用魔法),但它不是真正的克隆。
但是,findbugs并不知道这一点,所以它担心您可能正在尝试克隆一个非Cloneable对象。
这里的一种解决方案可能是将您的方法重命名为其他名称(copy()?),这样它就看起来不像是克隆方法。
发布于 2012-04-11 19:49:54
您可以阅读documentation。
Cloneable类实现Cloneable接口,以向Object.clone()方法指示该方法对该类的实例进行字段对字段复制是合法的。
在没有实现Cloneable接口的实例上调用对象的克隆方法会导致抛出异常CloneNotSupportedException。
但是,您没有以正确的方式使用clone()方法。看看这个wiki page。
发布于 2012-04-11 19:55:24
如果将克隆实现为
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
https://stackoverflow.com/questions/10105292
复制相似问题