使用Set创建一个新List的Java元素



我有一个方法changePlayer(),它从类Model的集合players中设置一个元素作为Model的字段currentPlayer的值;因为我不能直接从集合中获取元素,所以我用这个集合创建了一个新的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。然而,这并不是程序员通常会做的。

相关内容

  • 没有找到相关文章