2016-10-05 3 views
0

Ich versuche eine tiefe Kopie von Object (genannt State) zu erstellen, um Änderungen an einer der darin enthaltenen Instanzen vorzunehmen, gefolgt von Code, der die alte State basierend auf der neuen State modifiziert .Java-Klon-Klasse mit primitiven Typen

Hier ist 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(); 
    } 

} 

Dann ist hier, wie ich versuche, und greifen Sie:

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

s ist ein State in die Methode übergeben. Nachdem determineAction aufgerufen wird, wird aus irgendeinem Grund die board in s zusammen mit temp geändert, obwohl es nicht übergeben wird ... Wie kommt es? Sollte der Aufruf an .clone() Instanzen aller primitiven Typen nicht so klonen, dass sie eindeutig geändert werden können?

Das ist, was dieser Beitrag schon sagt: http://howtodoinjava.com/core-java/cloning/a-guide-to-object-cloning-in-java/

Ich bin zu kämpfen, um zu sehen, warum dies nicht tief kopiert werden würde, und warum meine Änderungen an temp würden auch s ändern.

Alle Tipps würden sehr geschätzt werden - danke!

Bearbeiten - Für alle neugierig, hier ist was es fest:

eine tief Kopie ist
@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; 
} 

Antwort

3

super.clone() nicht tun, und ein int[][] ist kein Urtyp.

Es funktioniert für die int player, denn das ist ein primitiver Typ und eine einfache Kopie (wie getan von Object#clone) ist genug.

Sie müssen Ihre int[][] selbst (tief) kopieren.

+0

Das hat funktioniert, vielen Dank! – midwestcode

0

Tiefes Klonen für primitive Datentypen. Sie können tiefes Klonen mit Serialisierung auch erreichen

Verwandte Themen