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

标签 scala constructor initialization final

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

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

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

最佳答案

初始化后您无法分配给 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) 来获取具有自定义初始化的新人,但构造函数本身仍然接收构造新实例所需的所有内容,其中所有值仅被分配一次。

关于scala - 在主构造函数中初始化时重新分配给 val,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31661729/

相关文章:

c++ - 绑定(bind)引用实际上是否评估操作数?

java - 将 Singleton 对象作为枚举元素的 Scala 枚举以及迭代它们的可能性?

c++ - 缺少第一个构造函数参数

c - 为什么下面的代码依赖于我初始化变量的时间?

java - 如何创建一个 "abstract field"?

java - 构造函数与 setter 注入(inject)

javascript - JS 平面对象作为矩阵坐标 : how to init all values?

java - 我的混合 Scala/Java Maven 项目无法编译

scala - SBT 从使用 xsbt-web-plugin 打包的 war 文件中排除 scala-library.jar

java - 从 S3 解压缩并读取 gz 文件 - Scala