簡體   English   中英

作為單身人士的特質

[英]Trait as Singleton

有可能有一個traitsingleton嗎?

我想要實現的是擁有一個干凈、輕量級的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM