プロパティがであり、変更されることが予想され、キャッシュに使用されているためvar
に変更したい場合は、問題があります。hashCode
変更されるものに基づいている場合hashCode
、次にそれを調べようとすると、hashCode
が変更されているため、オブジェクトが見つからない可能性が高く、間違った場所でそれを探します。
したがって、可能な限り、hashCode
変更される可能性のある値に基づいて設定することは避けてください。
これは台無しの簡単な例です:
scala> class X(var x: Int) {
| override def equals(that: Any): Boolean = that match {
| case other: X => x == other.x
| case _ => false
| }
| override def hashCode = x
| override def toString = "X("+x+")"
| }
defined class X
scala> val b = new X(5)
b: X = X(5)
scala> val s = scala.collection.immutable.HashSet(b)
s: scala.collection.immutable.HashSet[X] = Set(X(5))
scala> s contains b
res2: Boolean = true
scala> b.x = 6
scala> s contains b
res3: Boolean = false
scala> s
res4: scala.collection.immutable.HashSet[X] = Set(X(6))