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

scala – case类中的var成员是否会影响case类的相等性?

发布时间:2020-12-16 19:17:03 所属栏目:安全 来源:网络整理
导读:我在代码中大量使用了case类,回复了case类的底层相等定义,以便正确运行.然后我发现我需要将另一个字段成员添加到案例类中. 因此,如果我在case类中添加一个var字段成员,它会弄乱case类的相等属性吗? 如果1为是,那么如果我只更改一次var字段值,那么,在案例类
我在代码中大量使用了case类,回复了case类的底层相等定义,以便正确运行.然后我发现我需要将另一个字段成员添加到案例类中.

>因此,如果我在case类中添加一个var字段成员,它会弄乱case类的相等属性吗?
>如果1为是,那么如果我只更改一次var字段值,那么,在案例类进入任何集合或进行相等比较之前,不会发生任何重新分配,那还会破坏相等行为吗?

解决方法

Case类相等只基于它的主要构造函数属性,无论它们是var还是val(是的,你可以通过给出一个显式var来覆盖case类构造函数args所拥有的隐含val来使它们变成var.)在body中添加属性case类的大小不会影响编译器生成的equals(other:Any)方法.

见证人:

package rrs.scribble

object  CCVarEq
{
  case class CC1(i: Int,j: Float,var k: Double)

  case class CC2(i: Int,var k: Double) {
    var l = math.Pi
  }

  def show {
    val cc11 = CC1(1,2.0f,3.0)
    val cc12 = CC1(1,3.0)

    val cc21 = CC2(1,3.0); cc21.l = math.E
    val cc22 = CC2(1,3.0)

    printf("cc11 == cc12: %s%n",cc11 == cc12); cc12.k = math.Pi * math.E
    printf("cc11 == cc12: %s%n",cc11 == cc12)

    printf("cc21 == cc22: %s%n",cc21 == cc22)
  }
}

在REPL中:

scala> import rrs.scribble.CCVarEq._
import rrs.scribble.CCVarEq._

scala> show
cc11 == cc12: true
cc11 == cc12: false
cc21 == cc22: true

所有关于并发性的杰西的观点也是有效的.

(编辑:李大同)

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

    推荐文章
      热点阅读