在Java

时间:2016-06-02 13:12:05

标签: java collections

问题

我在项目中使用代码检查,它具有特定的集合分配规则:

Assignment to Collection field 'this.wildcards' from parameter 'wildcards' at line XX

这是可以理解的,提示非常明确 - 因为在分配后集合可以在对象之外进行变异,这将是一个隐式状态修改,可能导致许多难以检测的错误。

现在,我找到了this question,其中建议了一些要解决的选项。在我的情况下,浅拷贝可能是最简单的选项,因为我知道该集合非常简单,并且它的创建是一个简单的操作。

问题

我的问题是 - 如果我将集合成员定义为接口(很可能会这样做)会怎么样?我在这里看到了一个潜在的问题。例如,我的集合是Map<>,但要做浅层复制,我需要在那里定义确切的类型,比如HashMap<> - 所以我可能会欺骗我接受的类的用户{{1实际上,我使用它的一个特定实现。如果用户决定不使用Map<>而是使用其他东西......你就明白了。

考虑过的想法

我当然可以缩小类型并明确表示我希望使用HashMap<> - 但这是我不想对集合安全初始化的唯一原因做的事情。此外,我真的不在类逻辑中使用任何HashMap<>特定的东西,因此精确设置类型将是一种浪费。

那么我的选择是什么?实现安全复制+不缩小成员集合类型的最佳方法是什么?

编辑:如果重要,我会使用Java8

1 个答案:

答案 0 :(得分:0)

为什么你自己这么复杂?只需使用Map上提供的putAll

public void initialize(final Map<K, V> wildcards) {
    this.wildcards.clear();
    this.wildcards.putAll(wildcards);
}

虽然它仍然缩小了Map的实现,你可以用于你的实例字段,它只是那些支持putAll ... IIRC 所有 java API实现支持该操作..