Re/Create 包含不可变对象列表的不可变对象
Re/Create an immutable object that contains an immutable object list
背景
我正在尝试创建一个不可变对象,其中包含不可变对象列表以及列表中的对象类型总数。
我创建了一个稍微 sudo 要点来尝试展示我的意思。
Gist - Adjusting an immutable object that contains an immutable object list.
说明
我的示例展示了我目前的做法,它确实有效。但并非适用于所有情况。
我的VeggieCartView will have a recyclerview that gets filled with a new/saved VeggieCart.
每个 VeggieCart 都有一份蔬菜清单。素食总数等...
然后我有一个助手 class VeggieChanger,它包含一个 rx.Consumer<Veggie[]>
,它被设置并接受来自素食视图的任何 1:1 素食变化。
VeggieCartView 设置消费者,因此当任何蔬菜发生变化时,它会使用变化对应的购物车工厂方法创建更新的购物车。适配器用于 change/retrieve 它的列表。
工作与不工作
这适用于一次更改一个,但是批量更改会引发并发异常。
我意识到我的要点是不可运行的,并且没有显示大部分样板,而且我的一些或所有方法可能从根本上是错误的。话虽如此,我仍然希望有人可以就如何更好地实现我正在尝试做的事情给我建议。
如果需要了解更多信息,请询问。感谢任何提供帮助的人,
乔恩
我终于解决了我的主要问题。
通过将其添加到我的 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]);
}
}
它修复了并发错误。
我仍然不确定我的方法是否正确。因此,即使问题已基本得到解答,但仍然非常欢迎提出意见。
背景
我正在尝试创建一个不可变对象,其中包含不可变对象列表以及列表中的对象类型总数。
我创建了一个稍微 sudo 要点来尝试展示我的意思。
Gist - Adjusting an immutable object that contains an immutable object list.
说明
我的示例展示了我目前的做法,它确实有效。但并非适用于所有情况。
我的VeggieCartView will have a recyclerview that gets filled with a new/saved VeggieCart.
每个 VeggieCart 都有一份蔬菜清单。素食总数等...
然后我有一个助手 class VeggieChanger,它包含一个 rx.Consumer<Veggie[]>
,它被设置并接受来自素食视图的任何 1:1 素食变化。
VeggieCartView 设置消费者,因此当任何蔬菜发生变化时,它会使用变化对应的购物车工厂方法创建更新的购物车。适配器用于 change/retrieve 它的列表。
工作与不工作
这适用于一次更改一个,但是批量更改会引发并发异常。
我意识到我的要点是不可运行的,并且没有显示大部分样板,而且我的一些或所有方法可能从根本上是错误的。话虽如此,我仍然希望有人可以就如何更好地实现我正在尝试做的事情给我建议。
如果需要了解更多信息,请询问。感谢任何提供帮助的人,
乔恩
我终于解决了我的主要问题。
通过将其添加到我的 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]);
}
}
它修复了并发错误。
我仍然不确定我的方法是否正确。因此,即使问题已基本得到解答,但仍然非常欢迎提出意见。