Scala中的可更新单例对象

时间:2015-09-22 23:01:14

标签: scala singleton immutability mutable

我想在Scala中有一个具有可更新字段的单例对象。 有没有比我没有使用var更好的解决方案?

class Foo {

  def setFoo(newFoo: String): Unit = {
    Foo.foo = newFoo
  }

  def getFoo: String = {
    Foo.foo
  }
}

object Foo {
  var foo = "foo"
}

3 个答案:

答案 0 :(得分:0)

如果您想要可变性(即变量不断更新),var是您唯一的选择。

但是你可以用"不可变的方式编写它" ,其中set意味着创建一个新的不可变实例:

class Foo(foo: String) {}

object Foo {
    create(foo: String): Foo = new Foo(foo)
}

// ...
Foo foo = Foo.create("foo")
val bar = foo.foo  // "foo"

答案 1 :(得分:0)

我会坚持你的原始实现,但保护你的可变单例到相关的类:

class Foo {

  def setFoo(newFoo: String): Unit = {
    Foo.foo = newFoo
  }

  def getFoo: String = {
    Foo.foo
  }
}

private [Foo] object Foo {
  var foo = "foo"
}

答案 2 :(得分:0)

使用var更好地解决您所拥有的问题可能只是

object Foo {
  var foo = "foo"
}

就是这样,你不需要这个类和那些setter,编译器会为你生成它们。 现在你可以这样做:

Foo.foo = "bar"

或读取这样的值

Foo.foo

我没有看到在没有变量的情况下在对象中具有可变状态的方法。