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