我编写了一个 API,其中的方法采用 java.util.Map
作为参数。提供的 map 包含必须按插入顺序排序的数据。所以我特别提到了这个参数:java.util.LinkedHashMap
。但我的一位同事要求我只将参数声明为 Map,并且客户端应该通过 API 的 javadoc 来了解。
我不明白为什么java.util.LinkedHashMap
是一种不好的做法,为什么我应该传入接口(interface)。这不是不必要的工作吗?如果客户不注意文档,可能会导致功能错误。(我知道他们应该这样做)。
最佳答案
您的 API 对参数有两个要求:
- 这是一个
map
- 它按插入顺序迭代。
LinkedHashMap
满足这些要求,但没有任何文档或规范表明所有插入顺序映射都必须继承自 LinkedHashMap
。通过指定 LinkedHashMap
,您将保证该参数满足您的要求,但您也会禁止拥有按所需顺序迭代的 Map
的人使用您的 API,但碰巧使用了不同的实现。
如果有人提供一些自定义ArrayBackedHashMap
怎么办?他们有一个满足您实际要求的对象(Map
和迭代顺序),但您声明为 LinkedHashMap
会阻止它工作。
一般来说,如果您希望您的代码被其他人使用(以及其余大部分时间),那么您应该尝试接受任何满足您实际要求的内容。在这种情况下,您的第二个要求并未正式与任何声明的类型相关联,这意味着您不应尝试使用类型来强制执行它。相反,请在 JavaDoc 中说明要求。
关于java - LinkedHashMap 或 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35373855/