Черта как синглтон - PullRequest
       19

Черта как синглтон

1 голос
/ 10 июля 2019

Возможно ли иметь 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(), которая извлекает существующий экземпляр элемента, если он уже существует, или создает его иным образом.

Ответы [ 2 ]

5 голосов
/ 10 июля 2019

Может быть, просто создать значение в сопутствующем объекте и ссылаться на него в 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.
3 голосов
/ 10 июля 2019

Технически вы можете сделать это так

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.

...