对象属性共享同一个实例

时间:2017-11-13 12:12:24

标签: java

我的某个课程出了问题。

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中的spells属性状态与我的方法choisirSpell调用后的secondSequence相同。它就像是同一个实例,或者HashCode不同。

我想要的是这两个对象的法术属性无论如何都是无关的。

1 个答案:

答案 0 :(得分:1)

首先,在接受另一个序列的Sequence的构造函数中,您只需为新序列分配相同的法术列表。而是使用:

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

其次,即使你喜欢上面的内容,只有列表对象不同,但两个列表都有相同的拼写对象。因此,设置一个法术属性将反映在两个列表上。

为了避免你必须创建一个具有相同法术属性的新法术对象,如果你打算让第二个列表完全拥有它自己的新法术副本。您可以在Spell上创建一个Copy构造函数或克隆方法来执行此操作。

这样,虽然将拼写对象从第一个列表添加到第二个列表,但它仍然是一个单独的实体。