【问题标题】:Java: how to make a private field Map immutable within a class?Java:如何使私有字段 Map 在类中不可变?
【发布时间】:2013-10-01 20:20:19
【问题描述】:
public class Hi {
    private final Map<String, String> map;
    public Map<String, String> getMap() {
        return map;
    }
}

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

return new HashMap<String,String>(map);

是否有另一种方法可以在不强制地图成为哈希图的情况下做到这一点?我希望它保持与以前相同的等级。

【问题讨论】:

  • 查看Collections.unmodifiableMap()
  • @Popcorn unmodifiableMap 是地图的非常薄的包装,而不是副本,因此如果您使用这种技术,您还需要确保没有人可以通过其他方式访问底层地图,因为它仍然可以修改。例如,如果Hi 的构造函数将地图作为参数,您应该复制它——如果您希望地图保持同一个类,这将很难做到。

标签: java object reference immutability getter-setter


【解决方案1】:

返回Collections.unmodifiableMap(map),它提供了它所包装的Map 的不可修改视图。引用the Javadocs for that method:

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

【讨论】:

    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2015-10-29
      • 1970-01-01
      • 2014-04-29
      • 2010-09-23
      • 2020-01-02
      • 2013-07-26
      • 2014-02-11
      • 1970-01-01
      • 2022-11-11
      相关资源
      最近更新 更多