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

reassignment to val while initializing in primary constructor

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

compile time error : reassignment to val

我是 scala 的新手,到目前为止我学会了如何使用主构造函数和 case 类 来初始化数据成员。我只是在徘徊,如果有一种方法可以在 this 中初始化 val 数据成员 var 数据成员 的初始化在下面工作正常:-

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

您不能在初始化后分配给 val。在 Scala 中,class 的主体是构造函数,您可以查看示例 here

通常,您只需将主构造函数本身中的所有变量定义为 "class parameters":如果您需要接收用于初始化的名称,则为 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) 来获得一个具有自定义初始化的新人,但构造函数本身仍然接收构建新实例所需的所有内容,其中所有值仅分配一次。