Java代码 - 为什么要在这里克隆变量?

时间:2010-11-12 15:41:19

标签: java immutability code-snippets

请查看以下从 javax.naming.InitialContext 复制的代码。 HashTable类型的参数正被传递给构造函数。这是代码片段

public InitialContext(Hashtable<?,?> environment) throws NamingException
{
    if (environment != null) {
        environment = (Hashtable)environment.clone();
    }
    init(environment);
}

我的问题是,为什么环境被克隆到可以直接传递给init方法?

2 个答案:

答案 0 :(得分:6)

此代码正在保护自己免受外部调用者的影响,从而更改HashTable的状态。

通过创建clone,它们可以确保对传入的Hashtable所做的更改不会反映在传入表的方法/对象中。

使用数组的简短示例:

//Outside code
int[] arr = new int[]{0, 1, 2, 3};

// method of class
public void init(int[] arr) {
    this.arr = arr; 
}

//meanwhile, in the external code
arr[0] = 42; // this change to the array will be reflected inside the object.

通过制作数组副本可以避免该漏洞。对原始数组的更改不会显示在副本中。

答案 1 :(得分:2)

因为它可以从这个方法的外部改变吗?