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;
}
}
最佳答案
Cloneable
在这里不需要。
这是因为您的 clone()
实现实际上并未克隆该对象。在 Java 中,克隆具体是指使用 Object.clone()
,它使用 JVM 魔法来复制对象。尽管您的代码做了某种等同于克隆的事情(更好的是,恕我直言 - 它避免使用魔法),但它不是真正的克隆。
然而,findbugs不知道这一点,所以它担心您可能正在尝试克隆一个非 Cloneable
对象。
这里的一个解决方案可能是将您的方法重命名为其他名称(copy()
?),因此它看起来不像是克隆。
关于java - 这里需要Cloneable吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10105292/