我理解使用对象的一个主要好处是,它们是真实对象而不是系统范围的功能。但最后这些对象也可以在系统范围内访问。
除了更多“pure” scala“对象”提供的额外好处之外。
我打赌有一个号码,但我无法弄明白哪个。
答案 0 :(得分:14)
object X {
private[this] val z=1
}
class X {
import X._
//won't compile
println(z)
}
答案 1 :(得分:2)
我可以看到的一个优点是对象将始终被懒惰地初始化。当访问类时,即使静态本身未被使用,Java上的静态也将被初始化。
请参阅此Java代码:
class StaticJava {
static String AA = "Static String";
StaticJava() {
}
}
当我调用StaticJava构造函数时,AA将始终初始化,即使它未被使用。
在Scala上:
object StaticScala {
val AA = "Static String"
}
class StaticScala
由于对象StaticScala将被转换为类似StaticScala $的东西,因此调用StaticScala类的构造函数将不会初始化单例对象。
答案 2 :(得分:2)
使用单例对象作为静态容器的替代,与OO相比,纯粹的命令式编程具有更多优势。毕竟,静态内容本质上是必需的,单例对象 面向对象。
答案 3 :(得分:1)
真正的问题应该是:为什么使用单例代替静态类(静态方法和字段)。
当然,一个好处是删除静态简化编译器和运行时方法解析。
另一个好处是,当你编写自己的代码时,拥有该语言支持的单例是非常有用的,你不必像私有构造函数和糟糕的getInstance()静态方法一样使用脏技巧。语法更清晰。
最后,静态方法和字段是并发不需要的副作用的噩梦。
答案 4 :(得分:-2)
据我所知,优势是语法经济。现在您不需要任何静态调用和字段引用废话。它们比实现策略的单个元素枚举更清晰(即实现接口的无状态类)。
你可能会争辩说他们也将静态部分分开了。
另一方面,可变静态在Java中已经太容易了。 Scala隐藏并合法化他们。