【发布时间】:2016-06-28 23:30:07
【问题描述】:
假设我正在编写一个应该返回 Map 的方法。例如:
public Map<String, Integer> foo() {
return new HashMap<String, Integer>();
}
考虑了一会儿,我决定一旦创建了这个地图就没有理由修改它。因此,我想返回一个ImmutableMap。
public Map<String, Integer> foo() {
return ImmutableMap.of();
}
我应该将返回类型保留为通用 Map,还是应该指定返回 ImmutableMap ?
从一方面来看,这正是创建接口的原因;隐藏实现细节。
另一方面,如果我这样保留它,其他开发人员可能会错过这个对象是不可变的这一事实。因此,我不会实现不可变对象的主要目标。通过最小化可以更改的对象的数量来使代码更清晰。更糟糕的是,一段时间后,有人可能会尝试更改此对象,这将导致运行时错误(编译器不会对此发出警告)。
【问题讨论】:
-
我怀疑有人最终会将这个问题标记为对争论过于开放。您能否提出更具体的问题而不是“WDYT”? “可以吗……?”例如,“返回常规地图是否有任何问题或注意事项?”以及“存在哪些替代方案?”
-
如果以后你决定它应该返回一个可变映射怎么办?
-
@immibis 大声笑,或者一个列表?
-
你真的想在你的 API 中加入 Guava 依赖吗?如果不破坏向后兼容性,您将无法更改它。
-
我觉得这个问题太粗略了,很多重要的细节都遗漏了。例如,您是否已经将 Guava 作为(可见)依赖项。即使您已经拥有它,代码 sn-ps 也是伪代码,并不能传达您真正想要实现的目标。你肯定不会写
return ImmutableMap.of(somethingElse)。相反,您会将ImmutableMap.of(somethingElse)存储为一个字段,并仅返回该字段。所有这些都会影响这里的设计。
标签: java design-patterns immutable-collections