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 に答える