java - 即使我已经将其声明为 final,我的 Face 类似乎也不是不可变的,我该如何纠正它?
问题描述
我正在尝试使我的 Face 类不可变,这样我的 Face 对象一旦被初始化就不会改变。这是我到目前为止所拥有的:
public class Face{
protected final int[][] grid;
protected Face half;
public Face(int[][] grid){
this.grid = grid;
}
public Face rotateRight(){
int rows = 3;
int cols = 3;
int[][] transposedArray = new int[3][3];
for (int i = 0; i<rows; i++){
for (int j = 0; j<cols; j++){
transposedArray[i][j]=grid[rows-j-1][i];
}
}
return new Face(transposedArray);
}
public Face rotateLeft(){
int rows = 3;
int cols = 3;
int[][] transposedArray = new int[3][3];
for (int i = 0; i < 3; i++){
for (int j = 0; j < 3; j++){
transposedArray[2-j][i] = grid[i][j];
}
}
return new Face(transposedArray);
}
public Face rotateHalf(){
half = this.rotateRight();
half = half.rotateRight();
return half;
}
public int[][] getGrid(){
return (this.grid).clone();
}
public String toString(){
String str = "";
for (int i = 0; i<3;i++){
for (int j = 0; j<3; j++){
str += String.format("%02d",grid[i][j]);
}
}
String str1 = str.substring(0,6);
String str2 = str.substring(6,12);
String str3 = str.substring(12,18);
return str1+"\n"+str2+"\n"+str3;
}
}
但是,当我尝试运行以下命令时:
int[][] g = f.getGrid();
g[1][1] = 9;
我希望 f 保持为
010203
040507
070809
但我最终得到
010203
040906
070809
反而。即使我已经将类声明为 final,我的 Face 对象是否不是不可变的?
解决方案
您需要grid
在构造函数中制作输入的防御性副本。
此外,字段也应该如此private
,课程也应该final
如此,尽管我怀疑最后两点不是你问题的原因。
未测试:
public Face(int[][] grid){
int temp[][] = new int[ grid.length ][];
for( int i = 0; i < temp.length; i++ )
temp[i] = Arrays.copyOf( grid[i], grid[i].length );
this.grid = temp;
}
推荐阅读
- angular - 如何根据角度10中的条件设置选择
- javascript - 如果单击/选择子选项,则在鼠标移出时保持子菜单打开
- android - AVD Pixel_3a_API_28 的模拟器进程被杀死
- javascript - 弹出选项卡的第二个选项中的内容不显示任何内容
- python - 为什么我的冒泡排序不能正常工作?
- reactjs - 调度清除我所有的数据表单输入reactjs
- python-3.x - Python:sqlalchemy - 仅映射结果
- html - 如果我点击标题中的关于按钮,如何直接进入我网站的关于部分?
- python - 在 matplotlib 中绘制三角函数的周期
- php - 404 未找到:带有参数的 laravel api