在这里,它不是一成不变的,因为可以更改HashMap的键和值(字段值)。请提出解决方案以使其成为真正的不可变类

时间:2018-08-24 05:23:35

标签: collections hashmap immutability

import java.util.*;

final class MyImmutableClass {
    private final HashMap h = null;

    public MyImmutableClass(HashMap h) {
        this.h = h;
    }

    public HashMap getH() {
        return h;
    }
}

1 个答案:

答案 0 :(得分:0)

您可以在您的课程中公开无法修改的地图:

import java.util.*;

final class MyImmutableClass {
    private final HashMap h = null;
    private Map<String, String> noModMap;

    public MyImmutableClass(HashMap h) {
        this.h = h;
        noModMap = Collections.unmodifiableMap(h);
    }

    public Map getH() {
        return noModMap;
    }
}

getH()返回的映射基本上是对在类构造期间传递的基础映射的只读视图。来自JavaDoc for Collections#unmodifiableMap

  

对返回的地图的查询操作会“读取”到指定的地图,并尝试直接或通过其集合视图修改返回的地图,从而导致UnsupportedOperationException。

因此,任何试图更改地图视图的人都会抛出异常,并且底层的初始地图无法从外部更改。