看看下面的代码,我从复制javax.naming.InitialContext。 HashTable类型的参数正在传递给构造函数。这里是代码片段Java代码 - 为什么要在这里克隆一个变量?
public InitialContext(Hashtable<?,?> environment) throws NamingException
{
if (environment != null) {
environment = (Hashtable)environment.clone();
}
init(environment);
}
我的问题是,为什么环境被克隆在这里时,它可以直接传递给init方法?
我想我会将你的第一句话改写为“此代码正在保护*本身*从外部调用者更改HashTable的状态。”尽管这是一个非常有限的保护,但是H'ashtable.clone()'是一个浅层克隆:调用者仍然可以更改可变值(我不记得上下文值是否仅限于字符串)。 – Anon 2010-11-12 15:48:58
@Anon,很好的建议。完成。 – jjnguy 2010-11-12 15:50:44
@Anon,他们唯一担心的是增加或删除的机会很大。他们可能使用不可变对象作为键或值。 – jjnguy 2010-11-12 15:52:01