问题
我在项目中使用代码检查,它具有特定的集合分配规则:
Assignment to Collection field 'this.wildcards' from parameter 'wildcards' at line XX
这是可以理解的,提示非常明确 - 因为在分配后集合可以在对象之外进行变异,这将是一个隐式状态修改,可能导致许多难以检测的错误。
现在,我找到了this question,其中建议了一些要解决的选项。在我的情况下,浅拷贝可能是最简单的选项,因为我知道该集合非常简单,并且它的创建是一个简单的操作。
问题
我的问题是 - 如果我将集合成员定义为接口(很可能会这样做)会怎么样?我在这里看到了一个潜在的问题。例如,我的集合是Map<>
,但要做浅层复制,我需要在那里定义确切的类型,比如HashMap<>
- 所以我可能会欺骗我接受的类的用户{{1实际上,我使用它的一个特定实现。如果用户决定不使用Map<>
而是使用其他东西......你就明白了。
考虑过的想法
我当然可以缩小类型并明确表示我希望使用HashMap<>
- 但这是我不想对集合安全初始化的唯一原因做的事情。此外,我真的不在类逻辑中使用任何HashMap<>
特定的东西,因此精确设置类型将是一种浪费。
那么我的选择是什么?实现安全复制+不缩小成员集合类型的最佳方法是什么?
编辑:如果重要,我会使用Java8
答案 0 :(得分:0)
为什么你自己这么复杂?只需使用Map
上提供的putAll
:
public void initialize(final Map<K, V> wildcards) {
this.wildcards.clear();
this.wildcards.putAll(wildcards);
}
虽然它仍然缩小了Map的实现,你可以用于你的实例字段,它只是那些支持putAll
... IIRC 所有 java API实现支持该操作..