具有合成val的scala case类

时间:2019-05-27 15:30:33

标签: scala

documentation page for case classes状态

  

案例类非常适合对不可变数据进行建模

在类似

的案例中具有合成值的任何风险/不利之处
case class Square(val side: Int) {
    val area = side * side
}

1 个答案:

答案 0 :(得分:1)

val主体中定义一个附加的case class并没有问题,但是请记住,与之相对应的是,编译器不会以任何特殊方式对待此值。构造函数的一部分。

这意味着它将不会用于hashCodeequalstoStringcopy等方法以及Product中的其他方法的实现中所有案例类都隐式地扩展了。

对于完全由构造函数中其他值定义的值(例如此处的area),这当然是完全可以的。我什至认为这是唯一正确的选择,因为area作为Square的构造函数参数将使其与side成为多余,并且每个编译器生成的方法都必须无用地处理。 area。它还可以选择与side不匹配的区域。

请注意,将area声明为val仅计算一次,然后存储该值,这会使每个Square实例在内存中的存储量更大。您还可以决定将其声明为def,以便在每次需要时进行计算。对于area,您只需执行简单的乘法运算,因此可能无关紧要,但是在更复杂的情况下却可以。

还要注意,据我所知,合成值术语通常保留给编译器生成的值。