3

我认为 Scala 中的“对象”与 Java 中的 Singleton 非常相似,这不被认为是一种好的设计实践。对我来说,单例就像另一种定义全局变量的方式,这是不好的。我写了一些这样的 Scala 代码,因为它很简单而且可以工作,但是代码看起来很难看:

object HttpServer { // I'm the only HttpServer instance in this program.
  var someGlobalState: State
  def run() {
    // do something
  }
}

我试图避免这样做。什么时候定义 Scala 对象比较好?

4

3 回答 3

10

不,许多 Scala 库严重依赖对象。

单例模式的主要目标是对象只能存在一个实例。对象也是如此。

您可能会误用它作为全局变量,但这不是重点。

例如,对象是工厂方法的好地方,也可以替代模块来保存函数。

于 2012-11-14T18:55:25.973 回答
8

为什么你假设你只想要全局变量?全局值和方法非常有用。这是您将object在 Scala 中使用的大部分内容。

object NumericConstant {
  val Pi = 3.1415926535897932385   // I probably will not change....
}

object NumericFunctions {
  def squared(x: Double) = x*x     // This is probably always what we mean...
}

现在,您必须小心使用全局变量,如果您愿意,可以在对象中实现它们。然后你需要弄清楚你是否粗心(注意:将一个类的相同实例传递给程序中的每个类和方法同样有问题),或者你正在做的事情的逻辑是否最好通过单一的全局值。

这是一个非常非常糟糕的主意:

object UserCache {
  var newPasswordField: String = "foo bar"
}

两个用户同时更改他们的密码,然后……嗯……你会有一些不满意的用户。

另一方面,

object UserIDProvider {
  private[this] var maxID = 1
  def getNewID() = this.synchronized {
    var id = maxID
    maxID += 1
    id
  }
}

如果你不做这样的事情,同样,你会有一些不满意的用户。(当然,您确实需要在启动时读取磁盘上有关用户 ID 号的一些状态……或者将所有这些内容保存在数据库中……但您明白了。)

于 2012-11-14T19:18:51.890 回答
4

全局变量本身并不坏。你只需要了解什么时候合适。因此,它object本质上并不坏。例如:

object HelloWorld {
  def main(args:Array[String]){
     println("Hello World")
  }
}

不用对这个话题进行长时间的讨论,我喜欢这样想:“我想要这些东西中的'只有一个',因为它最能反映现实吗?或者这是一个让事情'正常工作'的懒惰捷径?”

不要盲目而广泛地应用“单身不好”的规则。在很多情况下,“只有一个”是有意义的。在您的特定情况下,我需要更多上下文来提供更具体的建议。

于 2012-11-14T18:48:13.367 回答