2

我想知道是否有充分的理由使用Collection.empty[T]而不是new Collection[T]()(或相反)?还是只是个人喜好?

谢谢。

4

3 回答 3

5

new Collection[T]()每次调用都会创建一个新实例。另一方面,Collection.empty[T]很可能总是返回相同的单例object,通常在某处定义为

object Empty extends Collection[Nothing] ...

这会快得多。编辑:这仅适用于不可变集合,可变集合每次empty调用时都必须返回一个新实例。

于 2013-02-11T15:34:16.220 回答
1

你应该总是喜欢Collection.empty[Type].

于 2013-02-11T15:06:18.630 回答
1

除了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只是工厂的一个特例,所以同样的逻辑也适用。

于 2013-02-11T16:47:51.443 回答