【问题标题】:Using NULL as a key value in a Map在 Map 中使用 NULL 作为键值
【发布时间】:2012-01-06 11:01:21
【问题描述】:

我想知道在Map 对象中使用NULL 作为键是否被认为是好的样式,如果不是,还有哪些替代方法?

【问题讨论】:

  • 空值通常被视为未初始化的值。为什么要把它放在地图上?
  • 在什么情况下,您需要 null-key 吗?默认值?

标签: java coding-style map null key


【解决方案1】:

这通常不是好的风格。

由于NULL 通常表示未确定或未设置的值,因此将其用作映射的键​​通常会造成混淆。 (尽管可能在某些特定情况下有意义)

替代方案取决于情况,所以让我举个例子。假设我们想要文本中的特定字符串颜色,并且我们还想要与任何字符串都不匹配的文本的默认颜色。

private HashMap<String,Color> stringColors;
private Color defaultColor;

不要使用NULL 键将默认颜色存储在HashMap 中,而是将默认颜色放在特定变量中。这让任何查看代码的人都非常清楚这种颜色的确切含义。

我想说,驱动因素是您是否真的有一个可以在地图中直接查找的NULL 值。 (根据我的经验,这种情况并不经常发生)在我给出的这个特定示例中,默认颜色将用于任何不在地图中的字符串。在这种情况下,没有您想要颜色的 NULL 字符串。

【讨论】:

    【解决方案2】:

    我个人建议使用 Null 对象(请参阅 Null Object Pattern)或某种默认键,而不是 null 作为键。使用null 总是意味着你必须编写代码来防御NullPointerException,应该尽可能避免使用。

    编辑

    例如,如果您正在创建一个允许用户向地图添加值的 API(无论是自制的 Map 实现,还是使用地图存储其数据的实用程序类)并且您的第一个版本让他们使用null 作为密钥,您将总是必须支持null 密钥。因此,要么你的支持 Map 必须是一个接受 null 密钥的实现,要么你将不得不捕获吮吸密钥,并用代表 null 密钥的不同密钥替换它们。

    正如@Erick Robertson 提到的,在某些情况下接受null 键是有意义的。然而,如果你正在设计一个 API,你真的应该确保你想要处理这样的密钥,因为它总是意味着更多的代码来检查null。这也意味着您的 API 客户端需要更多的防御性代码。

    【讨论】:

      【解决方案3】:

      考虑使用类似 DefaultedMap 的东西,如果映射不包含给定键,则返回已知值。

      根据您的用例,它可能比使用 (a) null 键或 (b) NullObject 更干净。如果您描述您的实际用例,可能会更容易提供帮助。

      【讨论】:

        【解决方案4】:

        一般来说,空键和空值都是不好的风格。

        Google Guava 网站有两个很棒的页面,解释了不使用 Null 的方法和原因。

        LivingWithNullHostileCollections - How to cope with Collections that don't allow null

        UsingAndAvoidingNullExplained - Guava tools to use and avoid the use of null, explained.

        引用:

        但万一呢?

        如果您发现自己想将 null 元素放入这些 null 敌对野兽之一怎么办?

        • 如果在 Set 中或作为 Map 中的键 - 不要;如果您在查找操作期间明确特殊情况 null 会更清楚(不那么令人惊讶)
        • 如果作为 Map 中的值 - 忽略该条目;保留一组单独的非空键(或空键)
        • 如果在列表中 -- 如果列表很稀疏,您是否更愿意使用地图?
        • 考虑是否存在可以使用的自然“空对象”。并不总是有。但是有时。 例如:如果它是一个枚举,则添加一个常量来表示您期望 null 在这里表示的任何含义。
        • 只需使用不同的集合实现,例如 Collections.unmodifiableList(Lists.newArrayList()) 而不是 ImmutableList。
        • 屏蔽空值(这需要更多细节)
        • 使用Optional

        【讨论】:

          【解决方案5】:

          有时在映射中将默认值存储为Null 键的值很有用。我不知道其他情况。但它是合法的,如果它可以赚取一些利润,为什么你不应该呢?

          【讨论】:

          猜你喜欢
          • 2013-01-01
          • 1970-01-01
          • 2016-07-31
          • 1970-01-01
          • 1970-01-01
          • 2011-07-18
          • 2019-04-20
          • 2011-05-08
          相关资源
          最近更新 更多