考虑玩家等级...当玩家加入游戏(创建对象)时,它会检查已经加入的同名玩家...
let
我知道Iterator可以解决这个问题,但是我们并不总是知道外部方法中的公共静态字段会发生什么,以及何时使用foreach以及何时使用Iterator ...
这个问题有什么好的做法吗?
答案 0 :(得分:3)
第一个也是更重要的良好做法称为关注点分离。如下所示:Player类应该模拟一个播放器。
您混合作为播放器的责任,并且管理整个播放器对象集合在一个地方。不要那样做!
这两件事根本不属于一起。在这个意义上:应该有一个PlayerManager
类,例如知道关于所有玩家。而且忘了使用像这样的static
字段。因为这会在班级的不同方面之间产生超紧密耦合。例如,当您需要多个玩家列表时会发生什么?如果您有这么多玩家想要根据某些属性在桶中组织它们怎么办?
除此之外,直接答案是:而不是立即从列表中删除对象 - 将它们收集到第二个playersToBeDeleted
列表中。并且在迭代第一个列表后,只需使用players.removeAll(playersToBeDeleted)
例如。
谈论良好做法:仔细考虑是否真的想要使用列表 - 或者设置不是更好的选择。列表总是暗示订单,而且,它们允许重复添加相同的对象。而Set则免费为您提供“独特元素”语义!
答案 1 :(得分:0)
我看到你正在尝试在for-each块内部调用list.remove(entry)
方法。别这么做。
在需要时使用Iterator
代替for-each构造:
请注意Iterator.remove
是在迭代期间修改集合的唯一安全方法;如果在迭代进行过程中以任何其他方式修改基础集合,则行为未指定。