Java:如何使私有字段映射在类中不可变? 公共类Hi{ 私人最终地图; 公共地图getMap(){ 返回图; } }

Java:如何使私有字段映射在类中不可变? 公共类Hi{ 私人最终地图; 公共地图getMap(){ 返回图; } },java,object,reference,immutability,getter-setter,Java,Object,Reference,Immutability,Getter Setter,我有一个Hi类,我希望map是不可变的。我还需要一个吸气剂。目前,另一个类可以从getter修改映射。我想返回map的副本来解决这个问题,但是map是一个接口,所以这是否意味着我必须进行getter调用: public class Hi { private final Map<String, String> map; public Map<String, String> getMap() { return map; } } 返回新

我有一个Hi类,我希望map是不可变的。我还需要一个吸气剂。目前,另一个类可以从getter修改映射。我想返回map的副本来解决这个问题,但是map是一个接口,所以这是否意味着我必须进行getter调用:

public class Hi {
    private final Map<String, String> map;
    public Map<String, String> getMap() {
        return map;
    }
}
返回新的HashMap(map);

有没有其他方法可以在不强制映射为hashmap的情况下执行此操作?我希望它保持与以前相同的类。

返回
Collections.unmodifiableMap(map)
,它提供了它所包装的
映射的不可修改视图。引述自:

返回指定映射的不可修改视图。这种方法允许 模块为用户提供对内部地图的“只读”访问。 对返回的映射“通读”到指定 映射,并尝试修改返回的映射,无论是直接映射还是通过 其集合视图会导致不支持的操作异常


使用Collections API返回不可修改的映射。

查看集合。unmodifiableMap()
@Popcorn
unmodifiableMap
是地图的一个非常薄的包装,而不是副本,因此如果使用此技术,还需要确保没有人能够以其他方式访问基础地图,因为它仍然可以被修改。例如,如果
Hi
的构造函数将映射作为参数,那么您应该复制它——如果您希望映射保持为同一个类,这将很难做到。
return new HashMap<String,String>(map);