我想知道使用NULL
作为Map
对象中的键是否被认为是好的风格,如果没有,那么它们是什么?
答案 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
键的值很有用。我不知道其他情况。但这是合法的,那么为什么你不应该赚钱呢?