[英]Trait as Singleton
有可能有一個trait
是singleton
嗎?
我想要實現的是擁有一個干凈、輕量級的 API,我可以在整個應用程序中擴展,如下所示:
trait SingletonTrait {
// element I wish to be unique throughout my application
val singletonElement = ///
...
}
// uses *singletonElement*
object MainApplication extends SingletonTrait {
...
}
// uses *singletonElement*
class SomeClass(...) extends SingletonTrait {
...
}
與getOrCreate()
函數隱含的想法相同,如果元素已經存在,則該函數將檢索元素的現有實例,否則會創建它。
也許只是在伴生對象中創建值並在trait 中引用它?
trait SingletonTrait {
final lazy val singletonElement = SingletonTrait.SingletonElement
}
object SingletonTrait {
lazy val SingletonElement = {
println("Creating singleton element!")
"singleton element"
}
}
// uses *singletonElement*
class SomeClass() extends SingletonTrait {
println(s"Using ${singletonElement} in class.")
}
new SomeClass()
new SomeClass()
new SomeClass()
它打印:
Creating singleton element!
Using singleton element in class.
Using singleton element in class.
Using singleton element in class.
從技術上講,你可以這樣做
object SingletonElement {
var count = 0
}
trait SingletonTrait {
final val singletonElement = SingletonElement
}
object MainApplication extends SingletonTrait {
singletonElement.count = singletonElement.count + 1
}
class SomeClass extends SingletonTrait {
singletonElement.count = singletonElement.count + 1
}
我們可以測試相同的對象是否像這樣使用
new SomeClass
MainApplication
SingletonElement.count
哪個應該輸出
res2: Int = 2
這表明使用了相同的SingletonElement
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.