在java中如何确保传递的对象仅被传递给它的对象修改?

时间:2012-12-12 11:22:21

标签: java

假设我有一个类,它接受一个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数组。我怎么能这样做?

4 个答案:

答案 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]);
}

您可以通过在网络上搜索“防御性复制”来获取有关此做法的更多详细信息。