我想知道是否有充分的理由使用Collection.empty[T]
而不是new Collection[T]()
(或相反)?还是只是个人喜好?
谢谢。
new Collection[T]()
每次调用都会创建一个新实例。另一方面,Collection.empty[T]
很可能总是返回相同的单例object
,通常在某处定义为
object Empty extends Collection[Nothing] ...
这会快得多。编辑:这仅适用于不可变集合,可变集合每次empty
调用时都必须返回一个新实例。
你应该总是喜欢Collection.empty[Type]
.
除了Collection.empty[T]
更清楚意图之外,您应该支持它,原因与您在实例化集合时应该支持工厂方法的原因相同:因为那些工厂抽象出一些您可能不(或不应该)关心的实现细节。例如,当你这样做时,Seq.empty[String]
你实际上得到了一个List[String]
. 你可以直接实例化 aList[String]
但如果你关心的只是有一些 Seq
你会引入一个不必要的依赖List
(好吧,实际上你不能按现在的样子,因为List
已经是抽象的,但是为了争论,我们假设我们可以)工厂的全部意义在于具有一定程度的关注点分离,而不是为不必要的实例化细节而烦恼。
作为另一个更详细的例子,我们来谈谈collection.immutable.HashMap
. 这是一个非常具体的类,所以你可能认为这里不需要工厂。除了出于优化目的,伴随对象中的工厂collection.immutable.HashMap
实际上会根据您初始化地图的元素数量创建不同的子类(请参阅此问题:Scala:如何从地图制作哈希(特里)地图(通过播放中的异常))。显然,如果你直接实例化collection.immutable.HashMap
你将失去这个优化。
另一个常见的优化empty
是总是返回(当它是一个不可变集合时)相同的实例,这是另一个有用的优化,你会因为直接实例化集合而失去它。
因此,根据经验,您应该尽可能使用各种集合伴侣对象提供的工厂,以保护自己免受不必要的依赖,同时受益于集合框架提供的潜在优化。
empty
只是工厂的一个特例,所以同样的逻辑也适用。