如何在Scala中定义类构造函数中的val

时间:2017-09-27 19:30:19

标签: scala

我正在尝试在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,
    )
  }

但正如我上面提到的,我得到“应用程序不带参数”。我该怎么做?

2 个答案:

答案 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)
    }
  }