简体   繁体   中英

Trait as Singleton

Is it possible to have a trait be a singleton ?

What I am trying to achieve is to have a clean and lightweight API I can extend throughout my application like the following:

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 {
  ...
}

In the same idea implied by a getOrCreate() function that would retrieve an existing instance of an element if one already exists or creates it otherwise.

Maybe just create value in companion object and reference it in 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()

It prints:

Creating singleton element!
Using singleton element in class.
Using singleton element in class.
Using singleton element in class.

Technically you could do this like so

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
}

We can test that the same object is used like so

new SomeClass
MainApplication
SingletonElement.count

which should output

res2: Int = 2

which shows the same SingletonElement was used.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM