3

Scala の「オブジェクト」は Java の Singleton にかなり似ていると思いますが、これは良い設計手法とは見なされていません。私にとってシングルトンは、悪いグローバル変数を定義する別の方法のようなものです。簡単で機能するため、次のような Scala コードを書きましたが、コードが見苦しく見えます。

object HttpServer { // I'm the only HttpServer instance in this program.
  var someGlobalState: State
  def run() {
    // do something
  }
}

私はこれを避けるようにしています。Scala オブジェクトを定義するのはいつが良いですか?

4

3 に答える 3

10

いいえ。多くの Scala-Library はオブジェクトに大きく依存しています。

シングルトン パターンの主な目的は、オブジェクトのインスタンスが 1 つだけ存在できるようにすることです。同じことがオブジェクトにも当てはまります。

グローバル変数として誤用するかもしれませんが、それは重要ではありません。

オブジェクトは、たとえば、ファクトリ メソッドや関数を保持するモジュールの代わりに最適な場所です。

于 2012-11-14T18:55:25.973 に答える
8

なぜグローバル変数だけが必要だと思いますか? グローバル値とメソッドは非常に便利です。objectこれは、Scala で使用するもののほとんどです。

object NumericConstant {
  val Pi = 3.1415926535897932385   // I probably will not change....
}

object NumericFunctions {
  def squared(x: Double) = x*x     // This is probably always what we mean...
}

ここで、グローバル変数の使用に注意する必要があります。必要に応じて、それらをオブジェクトに実装できます。次に、あなたが不注意であるかどうか (注: クラスの同じインスタンスをプログラム内のすべてのクラスとメソッドに渡すことは同様に問題があります)、または実際に行っていることのロジックが単一のグローバル値。

これは本当に、本当に悪い考えです:

object UserCache {
  var newPasswordField: String = "foo bar"
}

2 人のユーザーが同時にパスワードを変更すると...うーん...何人かのユーザーが不満を持つことになります。

一方で、

object UserIDProvider {
  private[this] var maxID = 1
  def getNewID() = this.synchronized {
    var id = maxID
    maxID += 1
    id
  }
}

このようなことをしなければ、不満を抱くユーザーが何人か増えることになります。(もちろん、起動時にユーザー ID 番号に関するディスク上の状態を読み取る必要があります... または、そのすべてをデータベースに保持する必要があります... しかし、要点はわかります。)

于 2012-11-14T19:18:51.890 に答える
4

グローバル変数は本質的に悪いものではありません。いつそれが適切なのかを理解する必要があります。したがって、それobjectは本質的に悪いものではないということになります。例えば:

object HelloWorld {
  def main(args:Array[String]){
     println("Hello World")
  }
}

このトピックについての長い議論に入る前に、私はそれを次のように考えるのが好きです。 ?」

「シングルトンは悪い」というルールをやみくもに広く適用しないでください。何かの「1つだけ」が理にかなっている場合はたくさんあります。あなたの特定のケースでは、より具体的な推奨事項を提供するには、より多くのコンテキストが必要です。

于 2012-11-14T18:48:13.367 に答える