我曾大量使用case类在我的代码,回答案例类的基本平等定义,正常运行。 那么现在我发现我需要另一个领域的成员添加到一个案例类。
- 所以,如果我添加一个
var
的情况下,类字段成员,将它搞糟了的情况下阶级平等属性? - 如果1是肯定的,那么如果我只是改变了
var
字段值一次,之后,没有任何重新分配将发生的情况下,类进入任何收藏之前或做相等比较,将仍然搞糟平等的行为?
我曾大量使用case类在我的代码,回答案例类的基本平等定义,正常运行。 那么现在我发现我需要另一个领域的成员添加到一个案例类。
var
的情况下,类字段成员,将它搞糟了的情况下阶级平等属性? var
字段值一次,之后,没有任何重新分配将发生的情况下,类进入任何收藏之前或做相等比较,将仍然搞糟平等的行为? 案例类的平等是完全基于其主构造属性,无论他们是var
或val
(是的,你可以让他们var
给予明确的var
来覆盖隐含val
在体内这种情况下,类的构造函数ARGS拥有。)增加属性的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
和所有杰米的关于并发点是有效的,太。
这不是那么简单。 你在一个线程更新的情况下类变种,而另一个线程正在执行相等性检查。 除非VAR是挥发性的,这是合理的,进行平等检查之前换到VAR将不会传播给其他线程。 所以,你可以有竞争条件。 而不管是否只发生一次或多次。
要改变一次未定义到这一点的价值? 如果是这样,使用一个懒惰的VAL。 它有一个同步的担心,可能会减缓高性能的代码,但会符合您的使用情况。