使用NULL作为Map中的键值

时间:2011-11-25 15:33:42

标签: java coding-style map null key

我想知道使用NULL作为Map对象中的键是否被认为是好的风格,如果没有,那么它们是什么?

5 个答案:

答案 0 :(得分:8)

这通常不被认为是好的风格。

由于NULL通常表示未确定或未设置的值,因此将其用作地图的键通常会令人困惑。 (尽管可能存在特定的情况)

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

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

不是使用HashMap键将默认颜色存储在NULL中,而是将默认颜色放在特定变量中。这使得任何查看代码的人都能清楚地了解这种颜色的含义。

我想说,驱动因素是,如果你实际上有一个NULL值,可以直接在地图中查找。 (根据我的经验,这不常发生)在我给出的这个具体例子中,默认颜色将用于任何不在地图中的字符串。在这种情况下,没有您想要颜色的NULL字符串。

答案 1 :(得分:3)

我个人建议使用Null对象(请参阅Null Object Pattern)或某种默认密钥,而不是null作为密钥。使用null始终意味着您必须编码以防御NullPointerException,并且应尽可能避免使用。

修改

例如,如果您要创建一个允许用户向地图添加值的API(无论是自制的Map实现,还是使用地图存储其数据的实用程序类),您的第一个版本允许他们使用null作为密钥,始终必须支持null个密钥。因此,您的支持Map必须是接受null密钥的实现,否则您将需要陷入密钥,并使用代表null密钥的其他密钥替换它们

正如@Erick Robertson所提到的,有些情况下接受null键是有道理的。但是,如果您正在设计API,则应确保要确保要处理此类密钥,因为它总是意味着需要更多代码来检查null。它还意味着为您的API客户提供更具防御性的代码。

答案 2 :(得分:0)

如果地图不包含给定的密钥,请考虑使用DefaultedMap之类的内容返回已知值。

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

答案 3 :(得分:0)

一般来说,null键和空值都是不好的样式。

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,则它更清晰(不太令人惊讶)
  •   
  • 如果作为地图中的值 - 请忽略该条目;保留一组单独的非空键(或空键)
  •   
  • 如果在列表中 - 如果列表稀疏,您是否可以使用Map?
  •   
  • 考虑是否存在自然的&#34; null对象&#34;可以使用。并非总是如此。但有时候。       例如:如果它是一个枚举,添加一个常量来表示你在这里期望null的意思。
  •   
  • 只需使用不同的集合实现,例如Collections.unmodifiableList(Lists.newArrayList())而不是ImmutableList。
  •   
  • 掩盖空值(这需要更多细节)
  •   
  • 使用Optional
  •   

答案 4 :(得分:-1)

有时将map中的默认值存储为Null键的值很有用。我不知道其他情况。但这是合法的,那么为什么你不应该赚钱呢?