【发布时间】:2016-06-25 18:28:18
【问题描述】:
目前我有一个名为MatrixValue 的类,我想将其制成一个不可变对象,以便与MatrixValue 的实例交互的所有方法都无法更改其内部矩阵。然而,问题在于成员变量之一是一个名为RealMatrix 的可变对象,它存储了矩阵的所有实际数据。我已经在构造函数中加入了防御性复制,并摆脱了任何 mutator 方法。到目前为止,这是我的班级的样子:
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();
}
}
现在的问题是,如果有人调用matrixValue.getMatrix().setEntry(row, col, value);,他们可以有效地更改最终RealMatrix 成员变量的值。但是,我仍然希望能够返回有关RealMatrix 的信息。修复类不变性中的这个漏洞的最佳方法是什么?
编辑:还请记住,某些矩阵可能会占用大量内存,因此如果可能的话,我希望尽可能减少重复不必要信息的解决方案。
【问题讨论】:
-
您应该在 getMatrix() 方法中复制矩阵。
-
谢谢迈克尔,我想这就是我要做的。
标签: java immutability