我的某个课程出了问题。
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不同。
我想要的是这两个对象的法术属性无论如何都是无关的。
答案 0 :(得分:1)
首先,在接受另一个序列的Sequence的构造函数中,您只需为新序列分配相同的法术列表。而是使用:
this.spells = new ArrayList<>(pSequence.spells);
其次,即使你喜欢上面的内容,只有列表对象不同,但两个列表都有相同的拼写对象。因此,设置一个法术属性将反映在两个列表上。
为了避免你必须创建一个具有相同法术属性的新法术对象,如果你打算让第二个列表完全拥有它自己的新法术副本。您可以在Spell上创建一个Copy构造函数或克隆方法来执行此操作。
这样,虽然将拼写对象从第一个列表添加到第二个列表,但它仍然是一个单独的实体。