2016-10-05 9 views
0

Я пытаюсь создать глубокую копию файла Object (называемый State), чтобы внести изменения в один из экземпляров внутри него, а затем выполнить код, который изменяет старый State на основе нового State ,Класс Java Clone с примитивными типами

Вот State:

public class State implements Cloneable { 

    // 0: empty 
    // 1: white 
    // 2: black 
    private int[][] board; 

    private int player; 

    public State(int[][] board, int player) { 
     this.board = board; 
     this.player = player; 
    } 

    public int[][] getBoard() { 
     return board; 
    } 

    public int getPlayer() { 
     return player; 
    } 

    public void setBoard(int[][] board) { 
     this.board = board; 
    } 

    public void setPlayer(int player) { 
     this.player = player; 
    } 

    @Override 
    protected Object clone() throws CloneNotSupportedException { 
     return super.clone(); 
    } 

} 

Тогда, вот как я пытаюсь и доступ к нему:

State temp = (State) s.clone(); 
Action act = determineAction(temp); 
doSomething(s, act); 

s является State передается в метод. После того, как determineAction вызывается, по какой-то причине board в s изменяется вместе с temp, хотя он не передан ... Как получилось? Должен ли вызов .clone() клонировать экземпляры всех примитивных типов, чтобы они могли быть однозначно изменены?

Вот что этот пост предполагает: http://howtodoinjava.com/core-java/cloning/a-guide-to-object-cloning-in-java/

Я изо всех сил, чтобы понять, почему это не было бы глубоко скопирована, и почему мои модификации temp также модифицировать s.

Любые советы были бы весьма признательны - спасибо!

Edit - Для тех, кто любопытным, вот что установил его:

@Override 
protected Object clone() throws CloneNotSupportedException { 

    State cloned = (State) super.clone(); 

    int[][] clonedBoard = new int[8][8]; 

    for (int i = 0; i < 8; i++) { 
     for (int j = 0; j < 8; j++) { 
      clonedBoard[i][j] = board[i][j]; 
     } 
    } 

    cloned.setBoard(clonedBoard); 

    return cloned; 
} 

ответ

3

super.clone() не делает глубокий-копию, и int[][] не примитивный тип.

Это работает для int player, потому что это примитивный тип и простая копия (как сделано Object#clone).

Вам необходимо (глубоко) скопировать int[][] самостоятельно.

+0

Это сработало, спасибо вам большое! – midwestcode

0

Глубокое клонирование для примитивных типов данных. Вы можете добиться глубокого клонирования, используя сериализацию также

Смежные вопросы