【问题标题】:What are the differences between "object equality" created by the factory method of the companion object and case class?伴随对象的工厂方法创建的“对象相等”与案例类有什么区别?
【发布时间】:2020-06-08 21:36:24
【问题描述】:

当通过伴生对象的工厂方法创建的实例比较对象相等性时,会为假。

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

这两者有什么区别?

【问题讨论】:

  • == 不是 Scala 中的引用相等性。
  • 如果你真的想要引用相等使用a eq b

标签: scala equality case-class companion-object


【解决方案1】:

工厂方法不相关。在您的第一个案例中,对于案例类,它们只调用构造函数,因此代码可以简化为

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

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

因为Companion 不会覆盖equals(或从覆盖equals 的类/特征继承),所以您会得到Object 的定义,即任何两个不同实例的引用相等和false。

Case 覆盖 equals,因为它是一个案例类,并且实现只是比较 s 的值。

【讨论】:

  • 同伴不会覆盖 equals 但 Case 会。这是关键。谢谢。
  • == 在从案例类以外的类创建的实例之间是引用相等,对吗?
  • 如果左侧的类没有覆盖equals,这只是引用相等。案例类只是覆盖equals 的一种方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
相关资源
最近更新 更多