避免静态集合的ConcurrentModification的好习惯

时间:2018-02-13 11:39:49

标签: java concurrentmodification

考虑玩家等级...当玩家加入游戏(创建对象)时,它会检查已经加入的同名玩家...

let

我知道Iterator可以解决这个问题,但是我们并不总是知道外部方法中的公共静态字段会发生什么,以及何时使用foreach以及何时使用Iterator ...

这个问题有什么好的做法吗?

2 个答案:

答案 0 :(得分:3)

第一个也是更重要的良好做法称为关注点分离。如下所示:Player类应该模拟一个播放器

混合作为播放器的责任,并且管理整个播放器对象集合在一个地方。不要那样做!

这两件事根本不属于一起。在这个意义上:应该有一个PlayerManager类,例如知道关于所有玩家。而且忘了使用像这样的static字段。因为这会在班级的不同方面之间产生超紧密耦合。例如,当您需要多个玩家列表时会发生什么?如果您有这么多玩家想要根据某些属性在桶中组织它们怎么办?

除此之外,直接答案是:而不是立即从列表中删除对象 - 将它们收集到第二个playersToBeDeleted列表中。并且迭代第一个列表后,只需使用players.removeAll(playersToBeDeleted)例如。

谈论良好做法:仔细考虑是否真的想要使用列表 - 或者设置不是更好的选择。列表总是暗示订单,而且,它们允许重复添加相同的对象。而Set则免费为您提供“独特元素”语义!

答案 1 :(得分:0)

我看到你正在尝试在for-each块内部调用list.remove(entry)方法。别这么做。

在需要时使用Iterator代替for-each构造:

  1. 删除当前元素。 for-each构造隐藏了迭代器,因此您无法调用remove。因此,for-each构造不能用于过滤。
  2. 并行迭代多个集合。
  3. 请注意Iterator.remove是在迭代期间修改集合的唯一安全方法;如果在迭代进行过程中以任何其他方式修改基础集合,则行为未指定。