在java中,如何确保传递的对象只被传递到的对象修改?
假设我有一个类,它接受一个Key对象数组来构造一个keyHandler类的对象,如下所示:在java中,如何确保传递的对象只被传递到的对象修改?,java,Java,假设我有一个类,它接受一个Key对象数组来构造一个keyHandler类的对象,如下所示: class KeyHandler { Key[] keys; public KeyHandler(Key[] keys) { this.keys=keys } //more methods which modify key; } this.keys = keys.clone(); for (int i = this.keys.length - 1; i
class KeyHandler {
Key[] keys;
public KeyHandler(Key[] keys) {
this.keys=keys
}
//more methods which modify key;
}
this.keys = keys.clone();
for (int i = this.keys.length - 1; i >= 0; i--) {
this.keys[i] = new Key(this.keys[i]);
}
现在我从main调用这个构造函数
KeyHandler keyhandler = new KeyHandler(keys);
我想确保没有从main()修改keys数组。如何执行此操作?KeyHandler类应创建密钥数组的内部副本。那就安全了
class Keyhandler {
private Key[] keys;
public KeyHandler(Key[] keys) {
this.keys = new Key[keys.length];
System.arrayCopy(keys, 0, this.keys, 0, keys.length);
}
//more methods which modify key;
}
请注意,现在不能从外部操纵keys数组。但仍然可以更改键属性。为了绝对安全,您也应该克隆密钥。最好的方法是在类中复制数组:
this.keys = Arrays.copy(keys, keys.length);
但是请注意,如果
键
对象是可变的,并且您的主方法会改变数组中的一个键,那么您的本地副本也会观察到这种变化。为了防止这种情况发生,您可以使Key
不可变,也可以复制每个Key
对象(深度复制)。您可以通过对传递的数组进行深度复制来实现这一点。
使用object.clone()创建深度副本;
您还可以通过不直接访问该数组或在getArray()中返回该数组的深度副本来保护该数组不受外部更改的影响;
您还可以考虑使用Cuff.UnMudiFabelEistIn();p> 如果
Key
是一个不可变类,只需克隆数组:
this.keys = keys.clone();
如果Key
对象不是不可变的,则需要通过逐个复制数组的元素来进行深度克隆。如果Key
具有复制构造函数,则KeyHandler构造函数可能如下所示:
class KeyHandler {
Key[] keys;
public KeyHandler(Key[] keys) {
this.keys=keys
}
//more methods which modify key;
}
this.keys = keys.clone();
for (int i = this.keys.length - 1; i >= 0; i--) {
this.keys[i] = new Key(this.keys[i]);
}
您可以通过在web上搜索“防御性复制”来获得有关此做法的更多详细信息。您的代码在语法上不正确。您在主方法中创建了此数组,因此它实际上拥有它。您是否试图阻止自己对所声明的变量进行更改?这里的目标是什么?复制构造函数参数,并将其存储在
KeyHandler
中,而不是原始参数?您可以使用System.arraycopy()
方法复制密钥,以便将原始密钥保留在任何您喜欢的位置