【发布时间】:2016-06-29 14:14:19
【问题描述】:
我有一个方法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);
}
【问题讨论】:
-
你的测试告诉你什么?
-
您实际上可以在您的
getPlayers()方法中返回new ArrayList(players),因此该方法的用户不需要另一个包装器集合来修改列表。他们在尝试添加或删除元素时不会遇到UnsupportedOperationException。