java - 如何防止更改数组或对象的值
问题描述
我是Java的初学者。在开发程序时,我创建了一个带有以变量作为参数的构造函数的对象。但是当我在创建对象后更改变量的值时,我的对象具有第二个值而不是第一个值。我不希望我的对象改变值。我该怎么办?
public class Person {
public Person(int[] arrayTest) {
this.arrayTest = arrayTest;
}
public int[] getArray() {
return this.arrayTest;
}
public boolean canHaveAsArray(int[] arrayTest) {
return true;
}
private int[] arrayTest = new int[2];
public static void main(String[] args) {
int[] array = new int[] {5, 10};
Person obj1 = new Person(array);
array[0] = 20;
System.out.println(Arrays.toString(obj1.getArray()));
}
}
我的输出应该是 [5, 10],但我得到的是 [20,10]。即使如上所示更改数组的元素,我也需要得到 [5,10] 。我应该怎么办?
解决方案
如果将原始数组传递给 的构造函数Person
,则将引用传递给原始数组。arrayTest
所以内部实例的任何变化Person
都会反映在原始数组(int[] array
)中,反之亦然。
如果您不想更改Person
实例中原始数组元素的值,那么您有两种选择:
您可以修改
Person
构造函数中的代码以使用方法创建原始数组的副本,java.util.Arrays.copyOf
然后使用该副本:public Person(int[] arrayTest) { this.arrayTest = java.util.Arrays.copyOf(arrayTest, arrayTest.length); }
不要将原始数组传递给构造函数,而只需发送原始数组的副本:
Person obj1 = new Person(java.util.Arrays.copyOf(array, array.length));
但是,我更喜欢第一种方法。
如果你想阻止原始类型的变量的值,你可以使用final
关键字来做到这一点。例如:
private final int test = 1;
为防止更改对象内的值,您可以将字段标记为final
。对象实例声明中的final
关键字意味着不能重新分配变量,并且不保证如果对该对象的引用是共享的,则对象状态不会改变。为防止更改特定对象的状态,应将其字段标记为final
.
推荐阅读
- apache-spark - 可以在完整输出模式下在 Spark 结构化流中删除/控制中间状态吗?(火花 2.4.0)
- python - 使用 np.gradient 计算量子力学问题的梯度
- asp.net - 将自定义表链接到角色管理器
- powershell - 在条件中使用表达式/属性
- spring-boot - 如何使用 springdoc openapi 在 swagger ui 上有条件地忽略 PathVariable
- class - 如何使用 v-bind 将“动态”类添加到按钮
- python - 如何在mac上卸载python和所有包?
- javascript - 身份验证中的 Loopback 4 异常
- php - 在没有调用 writeClose() 的情况下使用 xdebug 调试 Magento 2 很困难
- json - Swift 和 JSON 让我发疯