如何返回常量集合

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"); } });