Java LinkedHashMap还是地图

Java LinkedHashMap还是地图,java,Java,我编写了一个API,其中一个方法将java.util.Map作为参数。提供的映射包含必须按插入顺序排序的数据。所以我特别提到了参数java.util.LinkedHashMap。但是我的一位同事让我将参数声明为Map,客户机应该通过API的javadoc知道 我不明白为什么java.util.LinkedHashMap是一种不好的做法,为什么我应该传入接口。这不是不必要的工作吗?如果客户不注意文档,可能会导致功能错误。(我知道他们应该这样做)。您的同事可能会说您文档中的映射必须按插入顺序排序,除

我编写了一个API,其中一个方法将
java.util.Map
作为参数。提供的映射包含必须按插入顺序排序的数据。所以我特别提到了参数
java.util.LinkedHashMap
。但是我的一位同事让我将参数声明为Map,客户机应该通过API的javadoc知道


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

您的同事可能会说您文档中的
映射必须按插入顺序排序,除了
LinkedHashMap
之外,其他类也可以满足这一要求


LinkedHashMap
作为一个契约,在任何情况下都显得很弱,因为它不能保证重新插入后的顺序。

您的同事可能意味着您记录了
Map
必须按插入顺序进行排序,除了
LinkedHashMap
之外,其他类也可以满足这一要求


LinkedHashMap
作为契约在任何情况下都显得很弱,因为它不能保证重新插入后的顺序。

根据Josh Bloch的说法,除非您使用该实现的特定方法,否则您应该始终将接口作为参数而不是其实现

请考虑您的客户端是否有自己的“代码> map 的实现,其中集合保持插入顺序,<强>也<>强>对您的客户端有一些好处(效率、业务逻辑等)。另一个例子可能是Google/Eclipse/Oracle对ordered

Map
的一些新的、更有效的实现,我并不知道


因此,除非您使用的是
LinkedHashMap
中的特定方法,否则应避免将其指定为参数。在插入之前,可以尝试对您的
映射进行排序,或者专注于提供好的javadoc。

根据Josh Bloch的说法,您应该始终将接口作为参数而不是其实现,除非您使用该实现的特定方法

请考虑您的客户端是否有自己的“代码> map 的实现,其中集合保持插入顺序,<强>也<>强>对您的客户端有一些好处(效率、业务逻辑等)。另一个例子可能是Google/Eclipse/Oracle对ordered

Map
的一些新的、更有效的实现,我并不知道


因此,除非您使用的是
LinkedHashMap
中的特定方法,否则应避免将其指定为参数。在插入之前,可以尝试对您的
映射进行排序,或者专注于提供好的javadoc。

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

  • 这是一张
    地图
  • 它按插入顺序迭代
  • LinkedHashMap
    满足这些要求,但没有任何文档或规范说明所有插入顺序映射必须继承自
    LinkedHashMap
    。通过指定
    LinkedHashMap
    ,您可以保证参数满足您的要求,但您也将禁止具有
    Map
    的人使用API,该映射按要求的顺序迭代,但恰好使用了不同的实现

    如果有人带来了一些定制的
    ArrayBackedHashMap
    ?他们有一个满足您实际需求的对象(
    Map
    和迭代顺序),但是您声明为
    LinkedHashMap
    会阻止它工作


    一般来说,如果您希望您的代码被其他人使用(并且大部分时间也是如此),那么您应该尝试接受任何符合您实际需求的东西。在这种情况下,您的第二个需求没有正式绑定到任何声明的类型,这意味着您不应该尝试使用类型来强制执行它。相反,请在JavaDoc中说明要求。

    API对参数有两个要求:

  • 这是一张
    地图
  • 它按插入顺序迭代
  • LinkedHashMap
    满足这些要求,但没有任何文档或规范说明所有插入顺序映射必须继承自
    LinkedHashMap
    。通过指定
    LinkedHashMap
    ,您可以保证参数满足您的要求,但您也将禁止具有
    Map
    的人使用API,该映射按要求的顺序迭代,但恰好使用了不同的实现

    如果有人带来了一些定制的
    ArrayBackedHashMap
    ?他们有一个满足您实际需求的对象(
    Map
    和迭代顺序),但是您声明为
    LinkedHashMap
    会阻止它工作


    一般来说,如果您希望您的代码被其他人使用(并且大部分时间也是如此),那么您应该尝试接受任何符合您实际需求的东西。在这种情况下,您的第二个需求没有正式绑定到任何声明的类型,这意味着您不应该尝试使用类型来强制执行它。相反,请在JavaDoc中说明需求。

    如果它必须作为
    LinkedHashMap
    运行,则需要
    LinkedHashMap
    。如果它只能作为一个
    映射
    ,则需要一个
    映射
    。你的意思是,如果它只能作为LinkedHashMap,那么应该使用LinkedHashMap?谁将使用该API?在我看来,在类型安全性和多态性之间有一个折衷。一方面,通过要求一个
    LinkedHashMap
    ,您可以保证该映射将具有所需的ordering属性。但另一方面,有人可能会有另一个
    Map
    实现,它也满足所需的订购要求