2017-11-13 19 views
2

私のクラスに問題があります。オブジェクト属性が同じインスタンスを共有しています

public class Sequence { 

    private ArrayList<Spell> spells; 

    public Sequence(ArrayList<Spell> spellsEnCours) { 
    this.spellsEnCours = spellsEnCours; 
    ... 
    } 

    public Sequence(Sequence pSequence) { 
    this.spells = pSequence.spells; 
    ... 
    } 
} 

私のコードにはどこでも静的フィールドはありません。 (例えば)

私の主な治療:

... 
ArrayList<Spell> mySpells = new ArrayList<Spell>(); 
    Spell spell1 = new Spell(150, 0, 0, "Spell 1", null); 
    Spell spell2 = new Spell(200, 2, 0, "Spell 2", new Buff(TypeBuff.ALLY_ATK, 2)); 
    Spell spell3 = new Spell(500, 3, 0, "Spell 3", null); 
    mySpells.add(spell1); 
    mySpells.add(spell2); 
    mySpells.add(spell3); 
    ArrayList<Sequence> mySequences = new ArrayList<Sequence>(); 
    Sequence initialSequence = new Sequence(mySpells); 
    Sequence secondSequence = new Sequence(initialSequence); 
    mySequences.add(initialSequence); 
    // Let's just consider this call set a Spell's class attribute to true/false in the list Attribute of Spell 
    secondSequence.choisirSpell(spell3); 
    mySequences.add(secondSequence); 

や呪文の状態私のinitialSequence属性では、私の方法choisirSpellのコールの後、私のsecondSequenceと同じになります。それは同じインスタンスのように、どちらかのHashCodeが異なっています。

私が望むのは、これら2つのオブジェクトの呪文属性は、とにかく独立していないということです。

+0

なぜなら、両方ともList 'mySpells'と同じ参照を使用しているからです。解決策は、空のListで2番目のSequenceを初期化し、 'secondSequence.spells.addAll(mySpells)'を呼び出すことです。 EDIT:2番目のコンストラクタを単に次のように置き換えることができます: 'this.spells = new ArrayList <>(); this.spells.addAll(pSequence.spells); ' – schrobe

+2

' this.spells = pSequence.spells; '' spells'は 'pSequence.spells'と同じインスタンスです。 'this.spells = new ArrayList <>(pSequence.spells);' –

答えて

1

まず、別のシーケンスを受け入れるシーケンスのコンストラクタで、新しいシーケンスに同じ呪文リストを割り当てているだけです。代わりに使用します。

this.spells = new ArrayList<>(pSequence.spells); 

第二に、あなたが上記のような場合でも、唯一のリストオブジェクトは異なりますが、まだ両方のリストには、同じスペルのオブジェクトを持っています。したがって、呪文の属性を設定すると両方のリストに反映されます。

2番目のリストを完全に独自の新しい呪文コピーにする場合は、同じ呪文属性を持つ新しい呪文オブジェクトを作成する必要があります。これを行うには、スペルにコピーコンストラクタまたはクローンメソッドを作成することができます。

このように、Spellオブジェクトは最初のリストから2番目に追加されますが、依然として別のエンティティになります。

+0

のような新しいインスタンスを作成してみてください。あなたの明確な答えをありがとう! :) –

+0

よろしくお願いします。 – Tharun

関連する問題