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
都进行了深度复制。然而,这不是程序员通常会做的。
我有方法 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
都进行了深度复制。然而,这不是程序员通常会做的。