考虑玩家类别...当玩家加入游戏(创建对象)时,它将检查是否已加入同名玩家...

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不是更好的选择。列表总是暗含顺序,而且,它们允许重复添加相同的对象。集合免费提供了“独特元素”的语义!

10-07 12:52