我认为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对象好?
答案 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")
}
}
我没有对这个话题进行长时间的讨论,我喜欢这样思考:“我只想要这些东西中的一个,因为这最能反映现实吗?或者这是一个懒散的捷径,可以让事情发生'只是工作'?“
不要盲目广泛地应用“单身人士不好”的规则。有很多情况下,“只有一个”的东西是有道理的。在您的特定情况下,我需要更多上下文来提供更具体的建议。