这是不可能的,但是有一些方法(除了使用param1作为构造函数参数)
- 将 更改
var
为Option
; settermyMethod1
返回同一个类的新实例,并将其Option
设置为该值。
- 用 a创建一个单独的可变
Builder
类var
,然后在收集完所有数据后将其转换为不可变类
- 如果您正在处理前向或循环引用,请考虑使用按名称调用和
lazy val
s(示例 1,示例 2)
更新:示例 1:
class MyClass(val myVal1: Option[Int]) {
def myMethod1(param1: Int): MyClass = {
new MyClass(Some(param1))
}
}
object MyClass {
def apply() = new MyClass(None)
def apply(i: Int) = new MyClass(Some(i))
}
例如, immutable.Queue使用了这种模式。
更新:示例 3(循环引用):
// ref ... call by name
class MyClass(val id: Int, ref: => MyClass) {
lazy val myVal1 = ref
override def toString: String = s"$id -> ${myVal1.id}"
}
像这样使用:
val a: MyClass = new MyClass(1, b)
val b: MyClass = new MyClass(2, a)
println(a)
println(b)
更新:示例 3(前向参考):
class MyClass2(val id: Int)
// ref ... call by name
class MyClass(val id: Int, ref: => MyClass2) {
lazy val myVal1 = ref
override def toString: String = s"$id -> ${myVal1.id}"
}
与
val a = new MyClass(1, x)
println(a.id) // You can use a.id, but not yet the lazy val
val x = new MyClass2(10)
println(a)