如果一個客戶端val是lazy,但它沒有被呼叫,并且.close()被執行,它會拋出一個錯誤嗎?例子:
private lazy val cloudWatchClient = CloudWatchClient.builder.region(region).build
cloudWatchClient不叫。
稍后,我們將嘗試關閉它
try {
cloudWatchClient.close()
}
這是否意味著cloudWatchClient如果沒有在線呼叫,客戶端每次都會打開然后關閉cloudWatchClient.close()?
uj5u.com熱心網友回復:
不,它不會拋出錯誤(除非您CloudWatchClient在初始化時故意這樣做)。當您在val定義前加上lazy修飾符時,右側的初始化運算式只會在第一次使用時計算val。
這是一個很好的例子,它顯示了差異。首先是一個普通物件:
scala> object SomeObj {
val x = {
println("initializing x")
"done"
}
}
defined object SomeObj
scala> SomeObj
initializing x
val res0: SomeObj.type = SomeObj$@7c3c3d67
scala> SomeObj.x
val res1: String = done
現在包含一個物件lazy val:
scala> object SomeLazyObj {
lazy val x = {
println("initializing lazy x")
"done"
}
}
defined object SomeLazyObj
scala> SomeLazyObj
val res2: SomeLazyObj.type = SomeLazyObj$@3e4636c3
scala> SomeLazyObj.x
initializing lazy x
val res3: String = done
您現在可能可以直觀地看出,lazy在您的示例中所做的是避免cloudWatchClient當場初始化。事實上,它的初始化恰好發生在close()被呼叫之前,因為運算元是從左到右計算的,并且方法close()需要cloudWatchClient在它本身被呼叫之前進行初始化。
值得注意的是,與 a 不同def, alazy val不會被多次評估。在對 的第一次評估之后,結果被存盤起來,以便在隨后lazy val使用時重復使用。val
然而,它有一個技巧:如果在第一次評估你的程序中lazy val你得到一個Exception,下次你嘗試訪問時lazy val,它會嘗試重新評估自己。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/493064.html
標籤:斯卡拉
下一篇:Spark-合并兩列陣列結構型別
