Zur Zeit habe ich eine Klasse namens MatrixValue
, die ich zu einem unveränderlichen Objekt machen möchte, so dass alle meine Methoden, die mit einer Instanz von MatrixValue
interagieren, ihre innere Matrix nicht ändern können. Das Problem besteht jedoch darin, dass eine der Mitgliedsvariablen ein veränderbares Objekt ist, das RealMatrix
heißt und alle tatsächlichen Daten der Matrix speichert. Ich habe bereits eine defensive Kopie in den Konstruktor eingefügt und alle Mutator-Methoden losgeworden. Hier ist, was meine Klasse sieht wie bisher:Java Wrapper-Klasse unveränderlich mit mutierbaren Membern erstellen
public final class MatrixValue extends ExpressionValue{
/**
*
*/
private static final long serialVersionUID = -4231050452116360135L;
private final RealMatrix matrix;
public MatrixValue(RealMatrix matrix){
this.matrix = new Array2DRowRealMatrix(matrix.getData());
}
public MatrixValue(double[][] values){
matrix = new Array2DRowRealMatrix(values);
}
public RealMatrix getMatrix() {
return matrix;
}
@Override
public String toString(){
return matrix.getRowDimension() + "," + matrix.getColumnDimension();
}
}
Das Problem jetzt ist, dass, wenn jemand anruft matrixValue.getMatrix().setEntry(row, col, value);
sie sind effektiv in der Lage, den Wert der letzten RealMatrix
Membervariable zu ändern. Trotzdem möchte ich Informationen über die RealMatrix
zurückgeben können. Was ist der beste Ansatz, um dieses Loch in der Unveränderlichkeit der Klasse zu beheben?
EDIT: Beachten Sie auch, dass einige Matrizen speicherintensiv werden können. Wenn möglich, würde ich eine Lösung bevorzugen, die das Duplizieren unnötiger Informationen minimiert.
Mögliches Duplikat von [Make immutable Java object] (http://stackoverflow.com/questions/18194139/make-immutable-java-object) – astrogeek14
Sie sollten einen Klon der Matrix in der Methode getMatrix() erstellen. –
Danke Michael Ich denke, das ist, was ich tun werde. –