Java 个使用集合的新列表元素

Java element of a new List using a Set

我有方法 changePlayer() 将来自 class Model 的集合 players 中的一个元素设置为字段 currentPlayer 的值Model;因为我无法直接从集合中获取元素,所以我使用该集合创建了一个新的 ArrayList

我想知道的是,如果创建的元素仍在使用旧元素的引用或具有新引用,因此我对其所做的任何更改都不会更改在 Model.

public class Model extends Observable<Change> {

    private Set<Player> players;
    private Player currentPlayer;

    public Model() {
        players = new HashSet<Player>();
    }

    public void addPlayer(Player player) {
        currentPlayer = player;
        this.players.add(player);
    }

    public Set<Player> getPlayers() {
        return Collections.unmodifiableSet(this.players);
    }

    public Player getCurrentPlayer() {
        return currentPlayer;
    }

    public void setCurrentPlayer(Player currentPlayer) {
        this.currentPlayer = currentPlayer;
    }

}

public void changePlayer(Model game) {
    Player player2 = new Player(0);//the id in this case is 0

    //this is the part of the code where i create a list using the set
    List<Player> playersList = new ArrayList<Player>(game.getPlayers());

    for (int i = 0; i < playersList.size(); i++) {
        ... // some code that will set player2 by player2 = playersList.get(i)
    }

    // change the current player for the game
    game.setCurrentPlayer(player2);
}

您只是在创建一个新的 List,但是 List 中的引用仍然是相同的引用(复制了引用值,但这些值仍然指向相同的 Player,这类似于无论你的护照号码被复制多少次,号码仍然是你的身份)。因此,如果您更改方法中引用的 Player,您实际上是在更改原始 Model 中的 Player,这很明显,因为您还没有创建任何新的 Player 在你的方法体中,有吗? Player 实例不会被神奇地复制,因为它们不是原始类型。只有一个例外,您实际上是在克隆所有 Player 个实例,它在您的 game.getPlayers() 中,您实际上每个 Player 都进行了深度复制。然而,这不是程序员通常会做的。