我正在尝试创建列表的深层副本,但是即使尝试一切复制原始列表后,我仍然收到新列表为空的错误消息。
我不确定我的问题是否出在代码的深层复制部分,或者在将元素添加到原始列表时是否出错。到目前为止,我有:
public class OwnedPiggyBank
{
List<Coin> bank;
private Owner owner;
public OwnedPiggyBank(Owner owner)
{
this.owner = owner;
bank = new ArrayList<>();
}
public void add(List<Coin> coins)
{
bank.addAll(coins);
}
public List<Coin> deepCopy()
{
List<Coin> coins = new ArrayList<>();
for (Coin c : bank)
{
coins.add(new Coin(c));
}
return coins;
}
...与之相关的测试用例是:
public void test()
{
OwnedPiggyBank b = new OwnedPiggyBank("Lola");
List<Coin> coins = new ArrayList<Coin>(Arrays.asList(Coin.PENNY, Coin.LOONIE, Coin.TOONIE));
b.add(coins);
OwnedPiggyBank c = new OwnedPiggyBank(b);
assertEquals(coins, c.deepCopy());
}
答案 0 :(得分:2)
在构造函数public OwnedPiggyBank(Owner owner)
中,您拥有
bank = new ArrayList<>();
因此,deepCopy
bank
中的当然是empty
assertEquals(coins, b.deepCopy());
更有意义
如果您想保留test
的情况,那么您需要做类似的事情
public OwnedPiggyBank(OwnedPiggyBank owner)
{
this.owner = owner;
bank = owner.deepCopy();
}
答案 1 :(得分:1)
OwnedPiggyBank似乎没有构造函数,该构造函数可以接受书面测试用例的第4条语句中所述的另一个OwnedPiggyBank。添加如下所示的构造函数可以解决该问题。
OwnedPiggyBank(OwnedPiggyBank ob){
this.owner = ob.owner;
this.bank = ob.deepCopy();
}