java - LinkedHashMap 或 Map

标签 java

我编写了一个 API,其中的方法采用 java.util.Map 作为参数。提供的 map 包含必须按插入顺序排序的数据。所以我特别提到了这个参数:java.util.LinkedHashMap。但我的一位同事要求我只将参数声明为 Map,并且客户端应该通过 API 的 javadoc 来了解。

我不明白为什么java.util.LinkedHashMap是一种不好的做法,为什么我应该传入接口(interface)。这不是不必要的工作吗?如果客户不注意文档,可能会导致功能错误。(我知道他们应该这样做)。

最佳答案

您的 API 对参数有两个要求:

  1. 这是一个 map
  2. 它按插入顺序迭代。

LinkedHashMap 满足这些要求,但没有任何文档或规范表明所有插入顺序映射都必须继承自 LinkedHashMap。通过指定 LinkedHashMap,您将保证该参数满足您的要求,但您也会禁止拥有按所需顺序迭代的 Map 的人使用您的 API,但碰巧使用了不同的实现。

如果有人提供一些自定义ArrayBackedHashMap怎么办?他们有一个满足您实际要求的对象(Map 和迭代顺序),但您声明为 LinkedHashMap 会阻止它工作。

一般来说,如果您希望您的代码被其他人使用(以及其余大部分时间),那么您应该尝试接受任何满足您实际要求的内容。在这种情况下,您的第二个要求并未正式与任何声明的类型相关联,这意味着您不应尝试使用类型来强制执行它。相反,请在 JavaDoc 中说明要求。

关于java - LinkedHashMap 或 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35373855/

相关文章:

java - java 黑 jack

java - 如何在重试 struts 操作之前 sleep ?

java - 将文件从一个文件夹复制到另一个文件夹,并使用旧文件名+时间戳在新文件夹中重命名该文件

java - 由于奇怪的错误,无法使用 Cucumber 启动 Junit 测试

java - 我的 WAR 文件夹中没有 Java 类

java - 如何将给定的字符串转换为回文?

java - 如何向 JOptionPane 中的多个文本字段添加验证?

java - 我如何以编程方式 Autowiring 不属于 bean 的字段?

Java 更新唯一变量的问题,模拟 1 第 1 行队列

java - 如何检测所有 json 元素是否用于创建 Java 对象