1

iBatis と Java キャッシング ツール ehcache を使用するプロジェクトに取り組んでいますが、Scala でモデル クラスを実装しています。equals メソッドと hashCode メソッドをオーバーライドして、キャッシュでオブジェクトを簡単に管理できるようにする必要があると強く感じています。

scala クラスで必要なプロパティのほとんどは vars であるため、vars に依存し、オブジェクトの比較に効率的な効果的な equals 定義を作成するためのアドバイスが必要です。

コード例をいただければ幸いです。

ありがとう。

4

1 に答える 1

3

プロパティがであり、変更されることが予想され、キャッシュに使用されているため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))
于 2009-10-03T15:21:19.090 に答える