在java中,如何确保传递的对象只被传递到的对象修改?

在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

假设我有一个类,它接受一个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]);
}
现在我从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()
方法复制密钥,以便将原始密钥保留在任何您喜欢的位置