【问题标题】:Updatable singleton object in ScalaScala 中可更新的单例对象
【发布时间】:2015-09-22 23:01:14
【问题描述】:

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

class Foo {

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

  def getFoo: String = {
    Foo.foo
  }
}

object Foo {
  var foo = "foo"
}

【问题讨论】:

标签: scala singleton immutability mutable


【解决方案1】:

如果您想要可变性(即不断更新的变量),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"

【讨论】:

  • 你的例子不再是单例了?我希望对 Foo 的每次访问都是 foo 的当前值。
【解决方案2】:

我会坚持你原来的实现,但将你的可变单例屏蔽到关联的类:

class Foo {

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

  def getFoo: String = {
    Foo.foo
  }
}

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

【讨论】:

    【解决方案3】:

    使用var 的更好解决方案可能很简单

    object Foo {
      var foo = "foo"
    }
    

    仅此而已,您不需要类和那些设置器,编译器会为您生成它们。 现在你可以这样做了:

    Foo.foo = "bar"
    

    或像这样读取值

    Foo.foo
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 2022-06-23
      • 2020-04-26
      • 1970-01-01
      相关资源
      最近更新 更多