斯卡拉的懒惰单身人士

时间:2013-08-08 02:26:44

标签: scala scala-2.10

随着我对Scala的学习的继续,我对Scala语言中的一些选择很感兴趣。考虑删除静态类。在Java世界中(从我来到的地方),静态成员,单例和实例成员之间存在明显差异。 Java中一直存在对单例的持续需求,静态成员无法真正帮助它。我知道为什么单例可能比静态成员更受欢迎的主要用例是:

  1. 能够控制单例对象的实例化。如果加载类的实例是资源很重,我们希望将其推迟到以后才能实际需要。
  2. 能够在运行时配置单个对象。想象一下,必须阅读环境变量并在施工时填充我们的单身人士。如果成员是静态的,则无法完成此操作,因为在类加载时可能无法获知该信息。
  3. 然而,似乎Scala对单身人员的实施将缺乏上述好处。请看这里的讨论:http://pbadenski.blogspot.com/2009/06/design-patterns-in-scala-singleton.html

    在我看来, Scala完全解决了单例用例。这将令人失望。

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

    似乎我们必须与scala斗争以正确的方式获得单身人士!

    PS:这不是我的博客

2 个答案:

答案 0 :(得分:20)

斯卡拉的单身人士很懒惰。在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在使用之前不会被初始化。

答案 1 :(得分:0)

TOUR OF SCALA SINGLETON OBJECTS

  

对象是仅具有一个实例的类。引用时它是惰性创建的,就像一个惰性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