Переопределение методов equals и hashCode для JavaBeans, реализованного в Scala - PullRequest
1 голос
/ 03 октября 2009

Я работаю над проектом с использованием iBatis и инструмента кэширования Java ehcache, но я реализую классы моделей в Scala.У меня сильное чувство, что мне придется переопределить методы equals и hashCode, чтобы кэш-память легко управляла объектами на нем.

Поскольку большинство необходимых свойств в классах scala - это vars, мне нужносоветы по созданию эффективного определения равенства, которое зависит от переменных и эффективно при сравнении объектов.

Буду признателен за примеры кода.

Спасибо.

1 Ответ

3 голосов
/ 03 октября 2009

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