加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何在case类中定义自定义相等

发布时间:2020-12-16 08:59:42 所属栏目:安全 来源:网络整理
导读:我在下面定义了一个案例类Foo.我想覆盖==的行为,以便在比较中忽略最后一个元素(optBar).这是我尝试过的,似乎有效. case class Bar(i:Int)case class Foo(i:Int,s:String,optBar:Option[Bar]) { override def equals(o:Any) = o match { case Foo(`i`,`s`,_)
我在下面定义了一个案例类Foo.我想覆盖==的行为,以便在比较中忽略最后一个元素(optBar).这是我尝试过的,似乎有效.

case class Bar(i:Int)
case class Foo(i:Int,s:String,optBar:Option[Bar]) {
    override def equals(o:Any) = o match {
        case Foo(`i`,`s`,_) => true
        case _ => false
    }
    override def hashCode = i.hashCode*997  ^ s.hashCode * 991
}
val b = Bar(1)
val f1 = Foo(1,"hi",Some(b))
val f2 = Foo(1,None)
f1 == f2 // true

我想知道的是创建hashCode的方法是否正确.我从this link开始.

解决方法

您的hashCode定义是正确的,因为它符合equals / hashCode合约.但我觉得

override def hashCode = (i,s).##

更好阅读.

为了澄清它的作用:##只是一个调用hashCode的convenience method on scala.Any,但是正确处理null和一些与基元相关的角点情况.

val x: String = null
x.## // works fine. returns 0
x.hashCode // throws NullPointerException

所以(i,s).##创建一个i和s的元组(它有一个定义良好的hashCode方法),然后返回它的哈希码.因此,您不必手动编写涉及MurmurHash等的哈希代码方法.顺便说一句:如果元组的一个元素为null,这也将正常工作,而手写的哈希方法就像问题中的那个可能会抛出NPE.

但是,根据我的经验,如果您想修改案例类为您提供的任何内容,您实际上并不需要案例类.此外,在不考虑某些数据的情况下重写相等可能在某些方面似乎是一个聪明的想法,但它可能会导致一些非常混乱的行为.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读