Scala(单例)对象与典型的类级工件有什么好处

时间:2010-12-20 18:07:06

标签: scala singleton

我理解使用对象的一个​​主要好处是,它们是真实对象而不是系统范围的功能。但最后这些对象也可以在系统范围内访问。

除了更多“pure” scala“对象”提供的额外好处之外。

我打赌有一个号码,但我无法弄明白哪个。

5 个答案:

答案 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隐藏并合法化他们。