8

コンパニオン オブジェクトを理解しようとしているときに、クラスがインスタンス化された回数をカウントする次のコードを記述しました。カウントを維持するには、「var」を使用する必要がありました。同じタスクを達成するための「関数型プログラミング」の方法、つまり不変変数を使用する方法はありますか。

class C {
  C.counter+=1
  def someCFunction = {println ("some C function. Counter is "+C.counter)}
}

object C{
  var counter:Int=0 //I do not want to use var
}

val c1 = new C
c1.someCFunction

val c2 = new C
c2.someCFunction
4

3 に答える 3

2

それvarは、その性質上、悪いことではありません。それは理由のために言語にあります。それが表すもの、つまり何らかの形の変更可能な状態を維持するエンティティは、可能な限り避けるべきです。避けられない場合、設計で現在のクラス インスタンスの総数が必要な場合は、そのスコープを可能な限り制限する必要があります。

class C private {  // private constructor, can only use factory method
  def someCFunction = {println ("some C function. Counter is "+ C.getCount())}
}
object C{
  private[this] var counter:Int = 0    // not even companions can see this
  def apply() = {counter += 1; new C}  // factory method
  def getCount() = counter             // accessor method
}

val c1 = C()
c1.someCFunction

val c2 = C()
c2.someCFunction
于 2016-11-30T20:19:30.507 に答える