我什么时候应该在 Scala 中使用 "new"?
When should I use "new" in scala?
当我使用ArrayBuffer
时,我应该使用:
val arr = new ArrayBuffer[Int]
但是当我使用Map
时,我应该使用:
val map = Map[Int, Int]()
要了解为什么需要使用 Map[T, T]()
而不是 new Map[T, T](...)
,您需要了解伴随对象上的 apply 方法的工作原理。
伴生对象是与 class 同名的对象。此对象包含,通常包含工厂方法和其他方法,您需要(轻松)创建 class.
的对象
为了确保不必经过大量冗长的代码,Scala 使用了 apply 方法,当您像调用函数一样调用对象时,该方法会直接执行。
因此,Map
的伴生对象必须如下所示:
object Map {
def apply[K, V](...) = new Map[K,V](...) // Or something like this
}
虽然 class 会像
protected class Map[K, V](...) {
...
}
现在调用 Map[String, String](...)
你实际上是在调用 Map 伴生对象的 apply
方法。
ArrayBuffer
,这里没有伴随对象。因此,您需要直接使用构造函数自己创建 class 的新实例。
当我使用ArrayBuffer
时,我应该使用:
val arr = new ArrayBuffer[Int]
但是当我使用Map
时,我应该使用:
val map = Map[Int, Int]()
要了解为什么需要使用 Map[T, T]()
而不是 new Map[T, T](...)
,您需要了解伴随对象上的 apply 方法的工作原理。
伴生对象是与 class 同名的对象。此对象包含,通常包含工厂方法和其他方法,您需要(轻松)创建 class.
的对象为了确保不必经过大量冗长的代码,Scala 使用了 apply 方法,当您像调用函数一样调用对象时,该方法会直接执行。
因此,Map
的伴生对象必须如下所示:
object Map {
def apply[K, V](...) = new Map[K,V](...) // Or something like this
}
虽然 class 会像
protected class Map[K, V](...) {
...
}
现在调用 Map[String, String](...)
你实际上是在调用 Map 伴生对象的 apply
方法。
ArrayBuffer
,这里没有伴随对象。因此,您需要直接使用构造函数自己创建 class 的新实例。