Каковы различия между "равенством объектов", созданным методом фабрики объекта-компаньона и классом case? - PullRequest
0 голосов
/ 25 февраля 2020

При сравнении равенства объектов через экземпляры, созданные методом фабрики объекта-компаньона, оно будет ложным.

class Companion(s: String)
object Companion {
    def apply(s: String): Companion = {
        new Companion(s)
    }
}
val c1 = Companion("foo")
val c2 = Companion("foo")
println(c1 == c2) // false

Но почему это будет верно, если такая же ситуация создана классом дел?

case class Case(s: String)
val c1 = Case("foo")
val c2 = Case("foo")
println(c1 == c2) // true

В чем различия между этими двумя?

1 Ответ

3 голосов
/ 25 февраля 2020

Заводские методы не актуальны. Как в вашем первом случае, так и для классов case они просто вызывают конструктор, и поэтому код можно упростить до

new Companion("foo") == new Companion("foo")

и

new Case("foo") == new Case("foo")

, поскольку Companion не переопределяет equals (или наследование от переопределения класса / признака equals), вы получаете определение Object, которое является ссылочным равенством и ложью для любых двух разных экземпляров.

Case переопределяет equals потому что это класс case, а реализация просто сравнивает s значения.

...