5

该类java.util.Collections允许我使集合实例不可修改。下面的方法

protected Map<String, List<String>> getCacheData() {
    return Collections.unmodifiableMap(tableColumnCache);
}

返回一个 umodifiable Map,因此 anUnsupportedOperationException是由尝试更改地图实例引起的。

@Test(expected = UnsupportedOperationException.class)
public void checkGetCacheData_Unmodifiable() {
    Map<String, List<String>> cacheData = cache.getCacheData();
    cacheData.remove("SomeItem");
}

不幸的是,所有List<String>孩子都不是不可修改的。所以我想知道是否有办法对子值强制执行不可移动的行为List<String>

当然,或者我可以遍历映射键值对,使列表不可修改并重新组合映射。

4

4 回答 4

5

您需要一个包含 ImmutableList 实例的 ImmutableMap。使用番石榴来保持理智。

首先,创建您需要的 ImmutableList 实例:

ImmutableList<String> list1 = ImmutableList.of(string1, string2, etc);
ImmutableList<String> list2 = ImmutableList.of(string1, string2, etc);

然后创建您的 ImmutableMap:

ImmutableMap<String,List<String>> map = ImmutableMap.of("list1", list1, "list2", list2);

有很多方法可以实例化不可变列表和映射,包括构建器模式。查看ImmutableListImmutableMap的 JavaDocs了解更多详细信息。

于 2013-09-30T14:39:24.480 回答
4

不幸的是,您需要将每个 List 包装为不可修改的List. 这可以通过使用来完成java.util.Collections.unmodifiableList(...)。如果您可以控制 的创建Lists,那么您可以(并且应该)在设置值后立即执行此操作。如果您无法控制这些集合的创建,那么您可能需要重新考虑使其不可修改,因为您不知道的其他一些代码可能依赖于该行为。希望有帮助。

于 2013-09-30T14:11:47.537 回答
2

也许这不是您所需要的,但我建议使用 Guava不可变列表多图

于 2013-09-30T14:05:12.633 回答
0

子类 Map 返回不可修改的列表。

于 2013-09-30T14:40:22.947 回答