我想知道是否有充分的理由使用Collection.empty[T]
代替new Collection[T]()
(或反向)?或者这仅仅是个人偏好?
感谢。
答案 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
只是工厂的特例,因此适用相同的逻辑。