我有一个方法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
。然而,这并不是程序员通常会做的。