伴生对象的工厂方法创建的"object equality"和caseclass有什么区别?
What are the differences between "object equality" created by the factory method of the companion object and case class?
通过伴生对象的工厂方法创建的实例比较对象是否相等时,结果为假。
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
但为什么会出现与案例class相同的情况呢?
case class Case(s: String)
val c1 = Case("foo")
val c2 = Case("foo")
println(c1 == c2) // true
这两者有什么区别?
工厂方法不相关。在您的第一种情况下,对于 classes 的情况,他们只是调用构造函数,因此代码可以简化为
new Companion("foo") == new Companion("foo")
和
new Case("foo") == new Case("foo")
因为 Companion
没有覆盖 equals
(或者继承自 class/trait 覆盖 equals
),你得到 Object
的定义任意两个不同实例的引用相等和假。
Case
覆盖 equals
因为它是 class 的情况,并且实现只是比较 s
值。
通过伴生对象的工厂方法创建的实例比较对象是否相等时,结果为假。
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
但为什么会出现与案例class相同的情况呢?
case class Case(s: String)
val c1 = Case("foo")
val c2 = Case("foo")
println(c1 == c2) // true
这两者有什么区别?
工厂方法不相关。在您的第一种情况下,对于 classes 的情况,他们只是调用构造函数,因此代码可以简化为
new Companion("foo") == new Companion("foo")
和
new Case("foo") == new Case("foo")
因为 Companion
没有覆盖 equals
(或者继承自 class/trait 覆盖 equals
),你得到 Object
的定义任意两个不同实例的引用相等和假。
Case
覆盖 equals
因为它是 class 的情况,并且实现只是比较 s
值。