假设我有一个类,它接受一个Key对象数组来构造类keyHandler的对象,如下所示:
class KeyHandler {
Key[] keys;
public KeyHandler(Key[] keys) {
this.keys=keys
}
//more methods which modify key;
}
现在我从main
调用这个构造函数KeyHandler keyhandler = new KeyHandler(keys);
我想确保不从main()修改keys数组。我怎么能这样做?
答案 0 :(得分:0)
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;
}
注意,现在不能从外部操纵键阵列。但是仍然可以改变关键属性。为了绝对安全,你也应该克隆密钥。
答案 1 :(得分:0)
最好的方法是在你的班级中复制数组:
this.keys = Arrays.copy(keys, keys.length);
但请注意,如果Key
对象是可变的,并且您的main方法会改变您在数组中保存的其中一个键,则本地副本也会观察到该更改。为了防止这种情况发生,您可以使Key
不可变,也可以复制每个Key
个对象(深层副本)。
答案 2 :(得分:0)
你可以通过制作传递数组的深层副本来实现这一点。 使用object.clone()创建深层副本; 您还可以通过不对其进行直接访问或通过在getArray()中返回数组的深层副本来保护该数组免受外部更改; 您还可以考虑使用Collections.unmodifiableList();
答案 3 :(得分:0)
如果Key
是不可变类,只需克隆数组:
this.keys = keys.clone();
如果Key
个对象不是不可变的,则需要通过逐个复制数组的元素来进行深度克隆。如果Key
具有复制构造函数,则KeyHandler构造函数可能如下所示:
this.keys = keys.clone();
for (int i = this.keys.length - 1; i >= 0; i--) {
this.keys[i] = new Key(this.keys[i]);
}
您可以通过在网络上搜索“防御性复制”来获取有关此做法的更多详细信息。