请查看以下从 javax.naming.InitialContext 复制的代码。 HashTable类型的参数正被传递给构造函数。这是代码片段
public InitialContext(Hashtable<?,?> environment) throws NamingException
{
if (environment != null) {
environment = (Hashtable)environment.clone();
}
init(environment);
}
我的问题是,为什么环境被克隆到可以直接传递给init方法?
答案 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)
因为它可以从这个方法的外部改变吗?