Если свойства 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))