4

随着我对 Scala 的不断学习,我对 Scala 语言中的一些选择很感兴趣。考虑删除静态类。在 Java 世界中(我来自哪里),静态成员、单例成员和实例成员之间存在明显区别。Java 中一直存在对单例的持续需求,而静态成员无法真正提供帮助。我知道为什么单例可能优于静态成员的主要用例是:

  1. 能够控制单例对象的实例化。如果加载一个类的实例是资源繁重的,我们想把它推迟到以后,直到它真正需要它。
  2. 能够在运行时配置单例对象。想象一下在构建时必须读取环境变量并填充我们的单例。如果成员是静态的,则无法做到这一点,因为在类加载时可能不知道该信息。

然而,Scala 的单例实现似乎没有上述好处。看看这里的讨论:http: //pbadenski.blogspot.com/2009/06/design-patterns-in-scala-singleton.html

在我看来,Scala 根本没有解决单例用例。这将是令人失望的。

如果我的理解是正确的,那么下一个问题是:我们如何在 Scala 中启用惰性单例模式?

似乎我们必须与 scala 战斗才能以正确的方式获得单例!

PS:这不是我的博客

4

2 回答 2

22

Scala 中的单例是懒惰的。在您的 REPL 中尝试以下操作:

scala> object Foo { println("hello") }
defined module Foo

scala> 1+1
res0: Int = 2

scala> Foo
hello
res1: Foo.type = Foo$@37c8ccf4

scala> Foo
res2: Foo.type = Foo$@37c8ccf4

从 println 中可以看出,Foo 在使用之前不会被初始化。

于 2013-08-08T04:05:48.237 回答
0

Scala 单例对象之旅

对象是一个只有一个实例的类。它在被引用时是惰性创建的,就像一个惰性 val。

作为封闭类的成员或作为本地值,它的行为与惰性 val 完全相同。

下面是演示

scala> object Foo { println("hello") }
defined object Foo

scala> val f = Foo
hello
f: Foo.type = Foo$@2e26173

scala> object Foo { println("hello") }
defined object Foo

scala> lazy val f = Foo
f: Foo.type = <lazy>

scala> f
hello
res0: Foo.type = Foo$@7bf018dd
于 2018-08-14T02:20:34.663 回答