1

オブジェクトのディープ コピーを実行しようとしています。このコピーでは、元のオブジェクトを変更せずに新しいオブジェクトが変更されます。機能をテストするために、私はJUnitを使用して機能が機能することを確認しています。

現在のテストは、基本的にゲーム「マスエフェクト3」をコピーし、現在の声優を変更することです.

ゲームクラス

@Override
protected Object clone(){
    Game obj = new Game(getTitle(), getLeadVoiceActor(), getRating());
    return obj;
}

JUnit テスト

@Before
public void setUp() {
    p1 = new Person("Mark", "Meer");
    g1 = new Game("Mass Effect 3", p1, 5);
}

@Test
public void testClone() throws CloneNotSupportedException {
    //This works
    Game g2 = (Game)g1.clone();
    assertEquals(g2, g1);
    assertNotSame(g2, g1);

    //This doesn't even though the lead voice actor is now different
    p1 = g1.getLeadVoiceActor();
    p1.setFirstName("Jennifer");
    p1.setLastName("Hale");
    assertFalse(g2.equals(g1));
    assertEquals("Jennifer Hale", g1.getLeadVoiceActor().toString());
    assertEquals("Mark Meer", g2.getLeadVoiceActor().toString());
}

junit.framework.assertionfailederror でテストが失敗しています。

4

1 に答える 1

3

あなたの質問が:元のゲームの人物とクローン ゲームの人物が同じなのはなぜですか? の場合、答えは、ディープ クローニングではなく、シャロー クローニングであるということです。

複製されたゲームを呼び出しgetLeadVoiceActor()て結果を割り当てると、人物への参照が複製されたゲームに渡されます。コピーは作成されません。コピーを作成するには、次のものが必要です。

protected Object clone(){
    Game obj = new Game(getTitle(), (Person) getLeadVoiceActor().clone(), getRating());
    return obj;
}

また

protected Object clone(){
    Game obj = new Game(getTitle(), 
                        new Person(getLeadVoiceActor().getFirstName(), getLeadVoiceActor().getLastName()), 
                        getRating());
    return obj;
}

clone()コピー コンストラクターを優先して、 の使用は推奨されないことに注意してください。また、クローンを実装する場合は、super.clone().

また、不変の場合は Person を複製する必要がないことに注意してください。

于 2013-01-07T19:53:30.893 に答える