如何制作Map <string,list <string =“”> unmodifiable?</string,>

时间:2013-09-30 13:45:43

标签: java collections map unmodifiable

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

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

返回一个umodifiable Map,因此尝试更改地图实例会导致UnsupportedOperationException

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

不幸的是,所有List<String>个孩子都不可修改。所以我想知道是否有办法强制实施子值List<String>的无法模仿的行为?

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

4 个答案:

答案 0 :(得分:5)

你需要一个充满ImmutableList实例的ImmutableMap。使用Guava来保持理智。

首先,创建您需要的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以获取更多详细信息。

答案 1 :(得分:4)

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

答案 2 :(得分:2)

也许这不是你需要的,但我建议使用Guava immutable list multimap

答案 3 :(得分:0)

Subclass Map返回不可修改的列表。