我在我的代码中大量使用案例类,回复案例类的基本相等定义以正确运行。然后现在我发现我需要将另一个字段成员添加到案例类中。
- 那么如果我
var
在案例类中添加一个字段成员,它会弄乱案例类的相等属性吗? - 如果 1 是,那么如果我只更改
var
一次字段值,之后,不会发生任何重新分配,在 case 类进入任何集合或进行相等比较之前,这仍然会弄乱相等行为吗?
我在我的代码中大量使用案例类,回复案例类的基本相等定义以正确运行。然后现在我发现我需要将另一个字段成员添加到案例类中。
var
在案例类中添加一个字段成员,它会弄乱案例类的相等属性吗?var
一次字段值,之后,不会发生任何重新分配,在 case 类进入任何集合或进行相等比较之前,这仍然会弄乱相等行为吗?案例类相等性仅基于其主要构造函数属性,无论它们是var
还是val
(是的,您可以var
通过显式覆盖案例类构造函数 args 拥有var
的隐含来实现它们。)在 a 的主体中添加属性不会影响编译器生成的方法。val
case class
equals(other: Any)
见证:
package rrs.scribble
object CCVarEq
{
case class CC1(i: Int, j: Float, var k: Double)
case class CC2(i: Int, j: Float, var k: Double) {
var l = math.Pi
}
def show {
val cc11 = CC1(1, 2.0f, 3.0)
val cc12 = CC1(1, 2.0f, 3.0)
val cc21 = CC2(1, 2.0f, 3.0); cc21.l = math.E
val cc22 = CC2(1, 2.0f, 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
jamie 关于并发的所有观点也是有效的。
没那么简单。您在一个线程上更新案例类 var,而另一个线程正在执行相等检查。除非 var 是 volatile,否则在执行相等性检查之前,对 var 的更改可能不会传播到其他线程。所以你可能有竞争条件。不管这种情况只发生一次还是多次。
一旦未定义到该点,值是否要更改?如果是这样,请使用惰性 val。它有一个同步问题,可能会减慢高性能代码,但否则会满足您的用例。