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>
的无法模仿的行为?
当然,或者我可以遍历地图键值对,使列表不可修改并重新组合地图。
答案 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);
有许多方法可以实例化不可变列表和映射,包括构建器模式。查看ImmutableList和ImmutableMap的JavaDocs以获取更多详细信息。
答案 1 :(得分:4)
不幸的是,您需要将每个List包装为不可修改的List
。这可以通过使用java.util.Collections.unmodifiableList(...)
来完成。如果您可以控制Lists
的创建,那么您可以(并且应该)在设置值后立即执行此操作。如果您无法控制这些集合的创建,那么您可能需要重新考虑使其不可修改,因为您不知道的其他一些代码可能依赖于该行为。希望有所帮助。
答案 2 :(得分:2)
也许这不是你需要的,但我建议使用Guava immutable list multimap
答案 3 :(得分:0)
Subclass Map返回不可修改的列表。