我正在尝试在Class'构造函数中定义一个val,但我没有让它工作。这是一个相当激烈的计算,所以我不想运行它两次。我看到了以下链接,但当我尝试使用此代码时,它不起作用(我仍然得到“应用程序不带参数”):How do you define a local var/val in the primary constructor in Scala?
class MyModel(
val foo: String,
val bar: String,
val baz: String,
) extends db.BaseModel {
def this() = this(
foo = "",
bar = "",
baz = ""
)
def this(
foo: SomeModel,
bar: String,
baz: String,
) = {
this(
someModel.id,
doSomeComplexComputation(),
doSomeComplexComputation(),
)
}
我希望有类似的东西:
class MyModel(
val foo: String,
val bar: String,
val baz: String,
) extends db.BaseModel {
def this() = this(
foo = "",
bar = "",
baz = ""
)
def this(
foo: SomeModel,
bar: String,
baz: String,
) = {
val complexCalcSaved = doSomeComplexComputation()
this(
someModel.id,
complexCalcSaved,
complexCalcSaved,
)
}
但正如我上面提到的,我得到“应用程序不带参数”。我该怎么做?
答案 0 :(得分:4)
我建议在随播对象中创建构造函数。在您的情况下,这样的实现可以工作:
class MyModel(val foo: String, val bar: String, val baz: String) extends db.BaseModel
object MyModel {
//empty constructor
def apply(): MyModel = new MyModel("", "", "")
//another constructor
def apply(foo: SomeModel, bar: String, baz: String): MyModel = new MyModel(foo.id, doSomeComputation(bar), doSomeComputation(baz))
}
现在你可以调用构造函数:
//create a MyModel object with empty constructor
MyModel()
//create a MyModel object with the second constructor
MyModel(someModel, "string1", "string2")
答案 1 :(得分:1)
我会用伴侣对象和apply
方法写这个:
class MyModel(
val foo: String,
val bar: String,
val baz: String,
) extends db.BaseModel
object MyModel {
def apply(): MyModel = new MyModel("", "", "")
def apply(foo: SomeModel,
bar: String,
baz: String): MyModel = {
val complexCalcSaved = doSomeComplexComputation()
new MyModel(someModel.id, complexCalcSaved, complexCalcSaved)
}
}