【问题标题】:Java: Returning an Unmodifiable Collection but should be able to update the underlying CollectionJava:返回一个不可修改的集合,但应该能够更新基础集合
【发布时间】:2017-07-28 09:56:30
【问题描述】:

我面临一个设计问题,要求我维护一个地图,比如Map<String, List<String>>

我需要能够返回此地图的一个不可修改的实例,这样任何访问 API 的人都无法篡改底层地图。

Class InMemoryDB {

  private Map<String,List<String>> typeSlabValuesMap;

  public List<String> getSlabs(String typeValue){

    if (typeSlabValuesMap.containsKey(typeValue) {
      return Collections.unmodifiableList(typeSlabValuesMap.get(typeValue);
    }
    return Collections.emptyList();
  }
}

现在我还应该能够在需要时更改地图,例如

  1. 一个新类型进来了,我应该可以添加类型和slab值
  2. 需要更改板值我应该能够使用这些值更新地图

现在假设我只能在一个不可修改的列表中公开getSlabs,我应该如何设计上面提到的这张地图的更新部分?

【问题讨论】:

  • 您尝试过什么来解决您的问题?
  • 显示效果
  • 需要返回不可修改的地图还是不可修改的列表??
  • 当您将其提供给外部世界时,请尝试返回 Map / List 的克隆而不是实际的 Collection,以确保底层不会被修改。您应该能够通过您的 setter 方法修改原始 Collection,该方法可以具有适当的访问修饰符来限制访问。

标签: java oop design-patterns collections


【解决方案1】:

您的地图的所有更新都应该在您的班级中进行(无论如何,这似乎是班级的原始作者所希望的,因为他使用了 Collections.unmodifiable 包装器)。提供根据您的业务逻辑验证和更改地图的公共方法。关于您给出的示例:

  1. public void addNewType(String type, List&lt;String&gt; values)
  2. public void updateType(String type, List&lt;String&gt; values)

两者具有相同的签名,它们的内容会有所不同。在这些方法中,尽一切努力防止您的地图变得不一致。

【讨论】:

    猜你喜欢
    • 2020-02-27
    • 2017-05-02
    • 1970-01-01
    • 2014-04-18
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    相关资源
    最近更新 更多