【问题标题】:Warning Avoid using implementation types like 'HashMap'; use the interface instead警告 避免使用像 'HashMap' 这样的实现类型;改用界面
【发布时间】:2013-01-02 00:31:46
【问题描述】:

我在 Sonar 上收到此警告:

避免使用“HashMap”等实现类型;使用界面 而是

什么意思?

我得到这个警告的类是:

class A {
   private HashMap<String, String> map=new HashMap<String, String>();

   //getters and setters

}

拜托,我需要适当的解决方案来避免对声纳发出警告。

【问题讨论】:

  • 为什么要将地图投射到一个集合中?

标签: java


【解决方案1】:

您应该始终对接口进行编码。 IE。在这种情况下,您应该像这样声明您的字段:

private Map<String, String> map= new HashMap<String, String>();

这样,任何使用map 变量的东西都会将其视为Map 类型而不是HashMap

这使您可以在以后更换地图的底层实现,而无需更改任何代码。你不再绑定HashMap

阅读这个问题:What does it mean to "program to an interface"?

我也不确定你在做什么投射到 Set 那里?

【讨论】:

  • 我同意这是一个普遍的好习惯,但我对你第一句话中的“总是”有异议。例如,您很可能最终需要 LinkedListLinkedHashSetLinkedHashMap 的专用方法,在这种情况下,您将无法使用接口。至少在没有组合数据类型声明语法的 Java 中,你不能说“我想要一些 MapList 接口的交集”之类的话。如果你最终绕过界面,那么你就会失去上下文。
  • 请注意,始终使用基本接口可能会隐藏行为实现细节。例如,如果您使用不可变的List,那么使用List 接口而不是直接使用ImmutableList(或其他类型)可能不是最好的主意,因为您传达了错误的印象,即您的对象满足@ 987654336@ 接口,它没有。所以,这条规则肯定有例外。
  • 关于专用方法的使用确实如此,尽管这些情况非常罕见,所以我不会太担心措辞:)。我认为关于您的第二点,我仍然会使用该接口,因为如果您以后决定使用其他列表实现,它会让您可以选择重用代码。你只需要使用正确的异常处理。
  • @cowis 如何指定可序列化的地图?当我使用 Map 我的实现中断。有什么办法可以实现吗?
【解决方案2】:

我不使用声纳,但警告的基本意思是

总是编程到接口而不是实现类

private Map<String, String> map= new HashMap<String, String>();
        Interface                    Implementing class

【讨论】:

    【解决方案3】:

    通常,您应该始终针对接口而不是具体类型来实现。在此示例中,这意味着您应该这样编写代码:

    private Map<String, String> map= new HashMap<String, String>();
    

    最大的优势是您以后可以随时更改地图的具体实现,而不会破坏代码。

    要了解更多详情,请查看以下问题:What do programmers mean when they say, "Code against an interface, not an object."?

    【讨论】:

    • 我总是针对接口进行编码,但您使用“一般”这个词是对的。例如,GWT 更喜欢直接使用实现,因为这样可以提高编译性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 2019-10-04
    • 1970-01-01
    相关资源
    最近更新 更多