本java.util.Collections类允许我做集合实例不可修改.以下方法
protected Map<String, List<String>> getCacheData() {
return Collections.unmodifiableMap(tableColumnCache);
}
Run Code Online (Sandbox Code Playgroud)
返回一个umodifiable Map,因此UnsupportedOperationException尝试更改map实例会导致a.
@Test(expected = UnsupportedOperationException.class)
public void checkGetCacheData_Unmodifiable() {
Map<String, List<String>> cacheData = cache.getCacheData();
cacheData.remove("SomeItem");
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,所有List<String>孩子都不可修改.所以我想知道是否有办法强制实施儿童价值观的List<String>无法改变的行为?
当然,或者我可以迭代映射键值对,使列表不可修改并重新组合映射.
在设计一个小API的时候,我正准备编写一个引用String数组的静态值:
public static final String[] KEYS={"a","b","c"}
我发现在Joshua Bloch的"Effective Java"第14项中将其标记为"安全漏洞",他建议将其作为替代方案,声明te array'private'并提供返回不可修改列表的公共getter:
return Collections.unmodifiableList(Arrays.asList(KEYS))
Run Code Online (Sandbox Code Playgroud)
我只是不明白为什么这是必要的,初始语句中的数组被声明为final,即使它是公共的,它的元素是不可变的,如何从外部代码修改?