documentation page for case classes状态
案例类非常适合对不可变数据进行建模
在类似
的案例中具有合成值的任何风险/不利之处case class Square(val side: Int) {
val area = side * side
}
答案 0 :(得分:1)
在val
主体中定义一个附加的case class
并没有问题,但是请记住,与之相对应的是,编译器不会以任何特殊方式对待此值。构造函数的一部分。
这意味着它将不会用于hashCode
,equals
,toString
,copy
等方法以及Product
中的其他方法的实现中所有案例类都隐式地扩展了。
对于完全由构造函数中其他值定义的值(例如此处的area
),这当然是完全可以的。我什至认为这是唯一正确的选择,因为area
作为Square
的构造函数参数将使其与side
成为多余,并且每个编译器生成的方法都必须无用地处理。 area
。它还可以选择与side
不匹配的区域。
请注意,将area
声明为val
仅计算一次,然后存储该值,这会使每个Square
实例在内存中的存储量更大。您还可以决定将其声明为def
,以便在每次需要时进行计算。对于area
,您只需执行简单的乘法运算,因此可能无关紧要,但是在更复杂的情况下却可以。
还要注意,据我所知,合成值术语通常保留给编译器生成的值。