为什么使用Collection.empty [T]代替新的Collection [T]()

时间:2013-02-11 14:54:02

标签: scala

我想知道是否有充分的理由使用Collection.empty[T]代替new Collection[T]()(或反向)?或者这仅仅是个人偏好?

感谢。

3 个答案:

答案 0 :(得分:4)

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

object Empty extends Collection[Nothing] ...

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

除了Collection.empty[T]更清楚意图之外,你应该赞成它,原因与你在实例化集合时应该支持工厂方法的原因相同:因为工厂抽象出一些你可能没有的实现细节(或不应该)关心。 例如,当您执行Seq.empty[String]时,实际上会获得List[String]的实例。您可以直接实例化List[String],但如果您只关心某些 Seq,则会向List引入不必要的依赖(好吧,实际上你不能这样,因为List已经是抽象的,但让我们为了论证而假装我们可以 工厂的全部意义正是要有一定程度的关注分离,而不必担心不必要的实例化细节。

作为另一个更详细的例子,我们来谈谈collection.immutable.HashMap。这个是非常强大的具体类,所以你可能认为这里不需要工厂。除了出于优化目的,伴随对象collection.immutable.HashMap中的工厂实际上将根据您初始化地图的元素数创建不同的子类(请参阅此问题:Scala: how to make a Hash(Trie)Map from a Map (via Anorm in Play))。显然,如果你直接实例化collection.immutable.HashMap,你将失去这种优化。

empty的另一个常见优化是始终返回(当它是一个不可变集合时)同一个实例,这是另一个有用的优化,你可以通过直接实例化集合来丢失它。

因此,根据经验,您应该尽可能使用各种集合伴随对象提供的工厂,以便保护自己免受不必要的依赖关系,同时从中受益于潜在的优化。集合框架。

empty只是工厂的特例,因此适用相同的逻辑。