【发布时间】:2016-04-06 04:58:46
【问题描述】:
假设我在库中有一些案例类:
case class MyClass(a: Int, b: Int)
后来发现我的库中存在错误,我需要对这些参数之一应用一些额外的逻辑以保持工作正常,以便从用户的角度实例可以发生这种情况:
val x = MyClass(1, 2)
println(x.a) // prints '3' or whatever I happen to compute for 'a'
换句话说,x.a 的最终值不一定是传递给构造函数的值。我知道这看起来很疯狂,但相信我,我需要它。 x.a 在大多数情况下仍会返回传递给构造函数的任何内容,但构造函数参数有一个值会导致错误,我需要对其进行转换。
我看到了两种方法来实现这一点。我可以把a 变成var:
case class MyClass(var a: Int, b: Int) {
a = someComputation()
}
但是类变得可变,因为a 可以从外部设置。如果我可以删除或“隐藏”生成的设置器,我的问题将得到解决,但这似乎是不可能的。如果我添加
private def a_=(newA: Int) {}
它不会覆盖var 生成的setter,因此它会看到两个方法定义并且不会编译。
第二个选项是创建一个独立于构造函数参数的字段/方法:
case class MyClass(private val _a: Int, b: Int) {
val a = someComputation(a)
}
但_a 用于所有特殊生成的方法,例如equals、toString 等,而自定义字段a 没有功能。
有什么方法可以在不影响 API 其余部分的情况下转换构造函数参数?
【问题讨论】:
标签: scala constructor case-class