Effective Java
,第43项规定:
返回不可修改的空集合而不是
null
。
到目前为止一切顺利。有什么指导方针,到底要返回什么?这个问题甚至有意义吗?我在想的是:
LinkedList<>
或ArrayList<>(0)
会对您有所帮助吗?HashMap<>
或TreeMap<>
?性能差异?几乎不
内存占用?也许
CPU占用空间?也许
是否应该全局声明这些静态返回(即缓存)?
答案 0 :(得分:11)
它们已经被Collections
类缓存,其中包含一些实用方法。
您可以使用返回不可变空集合的Collections.emptySet()
,Collections.emptyMap()
和Collections.emptyList()
。只要您在代码中使用Set
,Map
和List
接口,就像您应该的那样。
还有一些方法可以返回包含单个实例的(也是不可变的)集合,例如Collections.singletonList(mySingleElement)
。
它们并没有真正影响性能,但它们确实使您的代码更加清晰:
return Collections.unmodifiableList(new ArrayList<>());
VS
return Collections.emptyList();
您还可以找到Collections.EMPTY_LIST
等,但在使用这些方法时,您可以避免因(缺乏)泛型而收到警告。
答案 1 :(得分:1)
您唯一关心的是:确保返回的集合不可变。
当你使用Collection类中的各种emptyXyz()
方法时,你会得到它。在这个意义上:只要确保你总是使用这些方法;并且不要浪费时间考虑替代方案。
如同:除非你在短时间内以数百万的电话顺序做某事,否则不要开始担心性能。编写简单,干净,可读的代码更为重要。因为当你这样做时,你(大多数情况下)也会有非显着“缓慢”的代码。
意义:当然,应该避免彻底愚蠢的性能错误。但是当这部分被覆盖时 - 不要假设你应该担心性能。当客户抱怨时,性能会成为问题。然后你描述你的代码正在做什么,找到真正的麻烦制造者。如果你发现emptyList()
是一件比其他任何东西都贵的东西并且花费你太多的东西 - 那么回过头来写一个关于那个的问题。 (可能永远不会发生)