根据Effective Java返回空集合

时间:2017-07-10 10:10:54

标签: java collections effective-java

Effective Java,第43项规定:

  

返回不可修改的空集合而不是null

到目前为止一切顺利。有什么指导方针,到底要返回什么?这个问题甚至有意义吗?我在想的是:

  • 是否返回emtpy LinkedList<>ArrayList<>(0)会对您有所帮助吗?
  • 是否返回空HashMap<>TreeMap<>
  • 会有所不同吗?

性能差异?几乎不

内存占用?也许

CPU占用空间?也许

是否应该全局声明这些静态返回(即缓存)?

2 个答案:

答案 0 :(得分:11)

它们已经被Collections类缓存,其中包含一些实用方法。

您可以使用返回不可变空集合的Collections.emptySet()Collections.emptyMap()Collections.emptyList()。只要您在代码中使用SetMapList接口,就像您应该的那样。

还有一些方法可以返回包含单个实例的(也是不可变的)集合,例如Collections.singletonList(mySingleElement)

它们并没有真正影响性能,但它们确实使您的代码更加清晰:

return Collections.unmodifiableList(new ArrayList<>());

VS

return Collections.emptyList();

您还可以找到Collections.EMPTY_LIST等,但在使用这些方法时,您可以避免因(缺乏)泛型而收到警告。

答案 1 :(得分:1)

您唯一关心的是:确保返回的集合不可变

当你使用Collection类中的各种emptyXyz()方法时,你会得到它。在这个意义上:只要确保你总是使用这些方法;并且不要浪费时间考虑替代方案。

如同:除非你在短时间内以数百万的电话顺序做某事,否则不要开始担心性能。编写简单,干净,可读的代码更为重要。因为当你这样做时,你(大多数情况下)也会有非显着“缓慢”的代码。

意义:当然,应该避免彻底愚蠢的性能错误。但是当这部分被覆盖时 - 不要假设你应该担心性能。当客户抱怨时,性能会成为问题。然后你描述你的代码正在做什么,找到真正的麻烦制造者。如果你发现emptyList()是一件比其他任何东西都贵的东西并且花费你太多的东西 - 那么回过头来写一个关于那个的问题。 (可能永远不会发生)