重新/创建包含不可变对象列表的不可变对象

时间:2017-04-19 22:48:25

标签: java android immutability

背景

我正在尝试创建一个不可变对象,其中包含一组不可变对象,以及列表中的对象类型总计。

我创造了一个有点sudo的要点,试图表明我的意思。

Gist - Adjusting an immutable object that contains an immutable object list.

解释

我的例子展示了我目前是如何做到的,它确实有效。但并非适用于所有情况。

我的VeggieCartView将有一个回收者视图,其中包含一个新的/已保存的VeggieCart

每个VeggieCart都有一份蔬菜清单。素食总数等...

然后我有一个帮助类VeggieChanger,它包含一个rx.Consumer<Veggie[]>,它被设置并接受来自素食视图的任何1:1素食更改。

VeggieCartView设置消费者,因此当任何一个素食变化时,它会使用更改来创建更新的购物车。相应的车厂方法。适配器用于更改/检索其列表。

工作而非

这适用于一次更改一个,但批处理更改会导致并发异常。

我意识到我的要点不是可以运行的,并且没有显示大多数样板,而且我的部分或全部方法可能从根本上是错误的。话虽如此,我仍然希望有人可以就如何更好地实施我想要做的事情给我建议。

如果需要了解更多信息,请询问。感谢任何有帮助的人,

乔恩。

1 个答案:

答案 0 :(得分:0)

我最终找出了我的主要问题。

将此添加到我的VeggieCartView:

public void bagAllCanned() {
  final Veggie[] canned = new Veggie[cart.canTotal()];
  final Veggie[] bagged = new Veggie[canned.length];
  int t = 0;
  final List<Veggie> veggies = cart.veggies();
  for (int i = 0; i < veggies.size(); i++) {
    final Veggie veggie = veggies.get(i);
    if (veggie.canned()) {
      canned[t] = veggie;
      if (veggie instanceof Potato)
      bagged[t] = Potato.can(veggie);
      else if (veggie instanceof Tomato)
        bagged[t] = Tomato.can(veggie);
      t++;
    }
  }
  for (int i = 0; i < canned.length; i++) {
    veggieChange(canned[i], bagged[i]);
  }
}

它修复了并发错误。

我仍然不确定我的方法是否正确。因此,即使问题大多得到回答,意见仍然非常受欢迎。