Scala案例类:在.copy()调用中将字段重置为默认值
我想跟踪自上次更新以来是否“检查”了Scala案例类:在.copy()调用中将字段重置为默认值,scala,case-class,Scala,Case Class,我想跟踪自上次更新以来是否“检查”了case class。这意味着在每次“检查”后将布尔标志翻转到true,并在更新案例类后(通过.copy调用)将布尔标志翻转回false。然而,我不知道如何做后一部分 那么,如何在每次更新后(例如,.copy调用)将案例类中的布尔标志重置为false 我有两个解决方案: 在代码库的每个位置手动更改标志:在每个调用中添加checked=false。(这个解决方案看起来很糟糕,因为有人可以创建.copy而不重置我的标志。此外,在一个代码库中有数百个.copy()调
case class
。这意味着在每次“检查”后将布尔标志翻转到true
,并在更新案例类
后(通过.copy
调用)将布尔标志翻转回false
。然而,我不知道如何做后一部分
那么,如何在每次更新后(例如,.copy
调用)将案例类中的布尔标志重置为false
我有两个解决方案:
在代码库的每个位置手动更改标志:在每个调用中添加checked=false
。(这个解决方案看起来很糟糕,因为有人可以创建.copy而不重置我的标志。此外,在一个代码库中有数百个.copy()
调用)
添加默认参数设置为false的var。这样,在每次调用.copy()
时,它将被重置:
第二个似乎更好,但我不太喜欢case类中的这种可变性
在不引入var
?的情况下,是否有其他方法(覆盖.copy()
?)来获得类似的结果?您是否意识到copy
正在创建一个新类?因此,即使修改旧实例中的变量,通常也会使用新实例。现在还不清楚你到底想要什么,为什么。我确实意识到了这一点。这就是为什么使用var
的技巧会奏效的原因。所以您想检查一下您的案例类中是否有名为copy
的人?为什么?这听起来像是XY问题。使用自动生成的方法是不可能的。您可以实现自己的.copy
,这将有一些逻辑,尽管这看起来您想要的是一个普通类,而不是一个不可变的case类。@Yevhenipopadiuk实际上,您似乎不想要一个不可变的case类,而是一个可变的类,因为您似乎不想创建该类的副本,您想修改它的内容。-在任何情况下,我都可能建议在类之外设置checked标志(或者至少在参与者之外不可见)。
case class A(..., checked: Boolean)
// somewhere in the code
a.copy(..., checked = false)
case class A(...) {
var checked: Boolean = false
}