如何返回常量集合

时间:2013-11-15 21:05:09

标签: java

java中有没有办法返回对类集合的引用,我无法更改它,也不能更改其元素的数据?

所以,如果我有一张地图Map<Integer, Set<String>>,没有人可以引用设定值并向其添加元素?

4 个答案:

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