在初级构造函数中初始化时重新分配给val

时间:2015-07-27 19:34:01

标签: scala constructor initialization final

class Person(){
    val name : String 
    def this(n : String) {
      this()
      this.name = n
    }
  }
compile time error : reassignment to val

我是scala的新手,到目前为止我学习了如何使用主构造函数和case类来初始化数据成员。如果有办法在这个中初始化 val数据成员,我只是在徘徊。 var data member 的初始化工作正常如下: -

class Person(){
    var name : String = _ 
    def this(n : String) {
      this()
      this.name = n
    }
  }

1 个答案:

答案 0 :(得分:5)

初始化后你无法分配给val。在Scala中,类的主体是构造函数,您可以看到示例here

通常,您只需将主构造函数本身中的所有变量定义为“类参数”:class Person(val name: String)如果需要接收初始化名称,或class Person() { val name = 'Joe' }如果它已修复。

这可能是非常令人惊讶的来自Java,因为您习惯于拥有生成值并直接构建对象的构造函数。对于这种情况,最好的解决方案是在配对对象上使用apply方法:

    class Person(val name: String)
    object Person() {
        def apply(db: SomeDBConnectionWrapper, id: Int) = new Person(db.fetchName(id))
    }

这允许您调用Person(db, 3)来获取具有自定义初始化的新人,但构造函数本身仍然会收到构建新实例所需的全部内容,其中所有值仅分配一次。