3

クラスは clone() を定義していますが、 Cloneablepublic GsmSignalStrength clone()を実装していません。

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ここでは必要ありません。

これは、の実装がclone()実際にオブジェクトのクローンを作成しないためです。Javaでは、クローン作成とは具体的には、を使用することを意味しObject.clone()ます。これは、JVMの魔法を使ってオブジェクトをコピーします。あなたのコードはクローン作成と同等の何かをしますが(そしてもっと良いのは、IMHO-魔法の使用を避けます)、それは本当のクローン作成ではありません。

ただし、Cloneableはそれを認識していないため、オブジェクト以外のクローンを作成しようとしているのではないかと心配しています。

ここでの解決策の1つは、メソッドの名前を別の名前(copy()?)に変更することである可能性があるため、クローンではないように見えます。

于 2012-04-11T12:32:57.437 に答える
3

ドキュメントを読むことができます。

クラスはCloneableインターフェースを実装して、Object.clone()メソッドに、そのメソッドがそのクラスのインスタンスのフィールドごとのコピーを作成することが合法であることを示します。

Cloneableインターフェイスを実装していないインスタンスでObjectのcloneメソッドを呼び出すと、例外CloneNotSupportedExceptionがスローされます。

clone()ただし、正しい方法でメソッドを使用していません。このwikiページを見てください。

于 2012-04-11T11:49:54.177 に答える
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 に答える