java中有没有办法返回对类集合的引用,我无法更改它,也不能更改其元素的数据?
所以,如果我有一张地图Map<Integer, Set<String>>
,没有人可以引用设定值并向其添加元素?
答案 0 :(得分:8)
即使Map
本身不可修改,也无法修改<{>} Map
内的所有对象的唯一方法是制作对象他们自己不可变。
unmodifiableMap()
方法保证Map
无法修改,但它根本不保证它包含的对象。看看this,了解如何使对象不可变。有关具体示例,请参阅String
类如何工作:您无法修改字符串中的字符,并且所有可以更改字符串的方法(例如:toUpperCase()
)确实返回< em> new 字符串。这就是您想要Map
内的对象的行为。
假设问题中的地图包含Set<String>
作为其值,那么在将添加到地图之前使用集合上的Collections.unmodifiableSet()
将使它们成为不可变的,因为{如上所述,{1}}已经是不可改变的。
答案 1 :(得分:7)
您可以使用Collections.unmodifiableMap
来查看无法修改的地图。
每种类型的集合都有不同的方法:
unmodifiableCollection
返回通用Collection unmodifiableSet
返回Set unmodifiableList
返回List unmodifiableSortedSet
返回SortedSet的无法修改的视图unmodifiableSortedMap
返回SortedMap的无法修改的视图如果这些项本身就是集合,您可以编写一个递归方法来构造一个新集合,该集合包含原始项目的不可修改的视图。
一般情况下,如果你在一个收藏中存储的物品本身可以被修改,那么没有什么可以阻止你这样做,除了制作防御性副本。
答案 2 :(得分:2)
通过您自己提供的方法调解对外部集合(Map
)的访问,可能最容易实现您的目标。然后,您可以在通过Set
后返回相应的Collections.unmodifiableSet()
对象。
由于String
是不可变的,因此在此之后,调用者真的没有任何改变。
除此之外,你必须构建一个新的Map
填充集,所有集合都通过Collections.unmodifiableSet()
传递,然后通过Collections.unmodifiableMap()
传递。但是,根据您的收藏量的大小,这可能是也可能不是一个好主意。
答案 3 :(得分:1)
地图:
Map<Integer, String> myMap =
Collections.unmodifiableMap(new HashMap<Integer, String>() {
{
put(1, "value1");
put(2, "value2");
put(3, "value3");
}
});
列表:
List<String> list = Collections.unmodifiableList(new ArrayList<String>() {
{
add("value1");
add("value2");
add("value3");
}
});
集:
Set<String> list = Collections.unmodifiableSet(new HashSet<String>() {
{
add("value1");
add("value2");
add("value3");
}
});