考虑玩家类别...当玩家加入游戏(创建对象)时,它将检查是否已加入同名玩家...
public class Player {
private static List<Player> players = new ArrayList<>();
private String name;
public Player(String name) {
this.name = name;
for (Player otherPlayer : players) { // Iterating static field
if (otherPlayer.name.equalsIgnoreCase(name)) {
otherPlayer.quit("Somebody with the same name joined the game");
}
}
}
public void quit(String message) {
players.remove(this); // Modifying static field
Server.disconnect(this, message);
}
}
我知道Iterator可以解决这个问题,但是我们并不总是知道外来方法中的公共静态字段会发生什么,何时使用foreach以及何时使用Iterator……
这个问题有什么好的做法吗?
最佳答案
第一个也是更重要的良好实践称为关注点分离。如:Player类应该为单个玩家建模。
您要担负起成为玩家的责任,并在一个地方管理整个Player对象集。不要那样做!
这两件事根本不属于在一起。从这个意义上说:例如,应该有一个PlayerManager
类,它了解所有玩家。并且也忘记使用这样的static
字段。因为那样会在类的不同方面之间产生超紧密的耦合。例如,当您需要多个玩家列表时会发生什么?如果您有如此多的播放器,想要根据某些属性将其组织在存储桶中怎么办?
除此之外,直接的答案是:不是立即从列表中删除对象,而是将它们收集到第二个playersToBeDeleted
列表中。在迭代第一个列表之后,只需使用players.removeAll(playersToBeDeleted)
例如。
谈论好的做法:仔细考虑您是否真的想使用列表-还是Set不是更好的选择。列表总是暗含顺序,而且,它们允许重复添加相同的对象。集合免费提供了“独特元素”的语义!