Scala:每个作用域中的对象都是相同的单例吗?
Scala: Is object in every scope the identical singleton?
我有一个 flink 应用程序。我在 map 函数中使用了一个对象。像这样:
.map(value => {
import spray.json._
import com.webtrekk.sObjects._
import com.webtrekk.jsonProtocol._
import com.webtrekk.salesforce._
implicit val effortProcessing = streamProcessor.Effort
implicit val effortConsulting = effortConsultingFormat
var effort = value.toString.parseJson.convertTo[effortConsulting]
streamProcessor.Effort.mapping(
value.toString.parseJson.convertTo[effortConsulting]
)
effort
})
streamProcessor 是一个对象。该对象内部是数据库的另一个服务对象。每当有事件来到应用程序时,Flink 都会执行这个映射函数。我想知道的是:对象每次都是同一个单例对象吗?
一个例子:
-> 事件到达应用程序 -> 将执行 map 函数并创建一个单例对象
-> 下一个事件到达应用程序 -> map 函数将再次执行 ->
对象将再次调用
第二个对象是同一个实例吗?
是也不是。对象在其范围内是单例:
scala> List(1, 2).map(i => { object foo { def bar: Int = i }; foo }).map(_.bar)
res2: List[Int] = List(1, 2)
这意味着以下内容大致相同:
object foo extends Thing { ... }
lazy val foo = new Thing { ... }
在你的例子中,因为对象是在 map
函数之外声明的,所以每次都是相同的实例。
我有一个 flink 应用程序。我在 map 函数中使用了一个对象。像这样:
.map(value => {
import spray.json._
import com.webtrekk.sObjects._
import com.webtrekk.jsonProtocol._
import com.webtrekk.salesforce._
implicit val effortProcessing = streamProcessor.Effort
implicit val effortConsulting = effortConsultingFormat
var effort = value.toString.parseJson.convertTo[effortConsulting]
streamProcessor.Effort.mapping(
value.toString.parseJson.convertTo[effortConsulting]
)
effort
})
streamProcessor 是一个对象。该对象内部是数据库的另一个服务对象。每当有事件来到应用程序时,Flink 都会执行这个映射函数。我想知道的是:对象每次都是同一个单例对象吗?
一个例子:
-> 事件到达应用程序 -> 将执行 map 函数并创建一个单例对象
-> 下一个事件到达应用程序 -> map 函数将再次执行 -> 对象将再次调用
第二个对象是同一个实例吗?
是也不是。对象在其范围内是单例:
scala> List(1, 2).map(i => { object foo { def bar: Int = i }; foo }).map(_.bar)
res2: List[Int] = List(1, 2)
这意味着以下内容大致相同:
object foo extends Thing { ... }
lazy val foo = new Thing { ... }
在你的例子中,因为对象是在 map
函数之外声明的,所以每次都是相同的实例。