У меня есть объектная игра моего класса Game.java в моем основном классе. Мне нужно создать копию (game_copy) игрового объекта, чтобы при внесении изменений в правление game_copy доски игры не менялись. Я делаю этот объект game_copy как:Глубокое клонирование объекта класса в java
Game game_copy = new Game() ;
game_copy = game.clone() ;
Но до сих пор, когда я внести изменения в совет game_copy, доска игры получает изменилась, поскольку они по-прежнему разделяют ссылку. Как мне решить эту проблему? Вот мои игры и rplayer классы, которые я использую:
class Game implements Cloneable{
int n;
ArrayList<ArrayList<String>> board;
rplayer [] players;
int a ;
public Game(int n){
this.n=n;
players = new rplayer[2] ;
players[0]=new rplayer(this.a);
players[1]=new rplayer(this.a);
board= new ArrayList<ArrayList<String>>();
for(int p= 0 ; p < n*n ; p++){
ArrayList<String> r = new ArrayList<String>() ;
board.add(r) ;
}
}
public Game clone(){
Game gm ;
try {
gm = (Game) super.clone();
}
catch (CloneNotSupportedException e) {
System.out.println (" Cloning not allowed. ");
return null;
}
return gm
}
}
class rplayer{
int a;
public rplayer(int a){
this.a=a;
}
}
Это то, что я пытался, прежде чем пытаться использовать .clone() метод, но идея сделать конструктор копирования не работает. Оба объекта всегда были связаны.
public Game(Game g){
this.n=g.n;
this.players = new rplayer[2] ;
rplayer[] temp_players = new rplayer[2] ;
temp_players = g.players;
this.players = temp_players ;
this.board= new ArrayList<ArrayList<String>>();
ArrayList<ArrayList<String>> temp_board = new ArrayList<ArrayList<String>>() ;
for(int p= 0 ; p < n*n ; p++){
ArrayList<String> r = new ArrayList<String>() ;
board.add(r) ;
temp_board.add(r) ;
}
temp_board = g.board ;
board= temp_board;
}
Возможный дубликат [Java deep copy library] (http://stackoverflow.com/questions/5001026/java-deep-copy-library) – Andremoniy
Существует понятие глубокой копии и мелкой копии. Кажется, вы хотите сделать глубокую копию и создать новый объект. Я предлагаю вам написать собственный код, который создает новый игровой объект и проходит через старый игровой объект и копирует по одному все переменные состояния, которые вы хотите сохранить в новом игровом объекте. Да, это больше работы и кода, но это лучший способ получить то, что вам кажется нужным. – mba12
@ mba12 Я добавил свой конструктор копий, который я использовал, прежде чем приступать к методу клонирования. Это тоже не сработало. –