我应该避免在Scala中定义“对象”吗?

时间:2012-11-14 18:40:23

标签: scala design-patterns

我认为Scala中的'object'非常类似于Java中的Singleton,这被认为不是一个好的设计实践。单身对我来说就像定义全局变量的另一种方式是BAD。我写了一些像这样的Scala代码,因为它很简单并且可以工作,但代码看起来很难看:

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

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

3 个答案:

答案 0 :(得分:10)

没有。许多Scala-Libraries严重依赖于对象。

Singleton-Pattern的主要目标是只存在一个Object实例。对象也是如此。

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

对象例如是工厂方法的好地方,或者替换模块来保存函数。

答案 1 :(得分:8)

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

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号的某些状态...或者将所有内容保存在数据库中......但是你明白了。)

答案 2 :(得分:4)

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

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

我没有对这个话题进行长时间的讨论,我喜欢这样思考:“我只想要这些东西中的一个,因为这最能反映现实吗?或者这是一个懒散的捷径,可以让事情发生'只是工作'?“

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