Скала Объект внутри Черты - PullRequest
11 голосов
/ 04 мая 2011

В Scala объекты являются синглетонами ... так что если я сделаю:

trait SimpleTrait {

  def setString(s: String): Unit = {
    InnerTraitObject setString s
  }

  def getString(): String = {
    return InnerTraitObject getString
  }

  object InnerTraitObject {
    var str: String = ""

    def setString(s: String): Unit = {
      str = s
    }

    def getString(): String = {
      return str
    }
  }
}

Тогда

class SimpleClass extends SimpleTrait{
 /// empty impl
}

и

object App {

  def main(args: Array[String]): Unit = {

    val a = new SimpleClass();
    val b = new SimpleClass();

    a.setString("a");

    println("A value is " + a.getString());
    println("B value is " + b.getString());
  }
}

Хотелось бы увидеть

A value is a
B value is a

но я получил

A value is a
B value is

Мой вопрос: Если объект одноэлементный, то почему, если я помещаю его в Trait, он ведет себя как обычный объект?

1 Ответ

20 голосов
/ 04 мая 2011

Это не глобальный синглтон, это синглтон, относящийся к экземпляру признака (который может иметь несколько экземпляров).Это зависит от того, где вы определяете синглтон: если он определен в пакете, то это синглтон относительно пакета, и пакет тоже синглтон, поэтому объект является синглтоном.Видите ли, это зависит от контекста, который вы определяете как синглтон.Если контекст одноэлементный, то и определенный объект тоже.

...