如何使用多个操作初始化字段


class A (names: String*) {
  val namesBuffer: ListBuffer[String] = new ListBuffer[String]
}

我想知道,在创建对象时,如何将主构造函数参数中的名称数组的名称添加到 namesBuffer 字段?我是否必须创建一个辅助构造器才能这样做,或者有没有其他方法可以告诉 Scala 在主构造函数中进行操作?

注意:上面的例子是虚构的,我只是想知道,我如何告诉主构造函数做一些比分配字段更多的操作。

正如 axel22 的答案所示,您可以在类主体中的任何位置执行这些操作。

但 IMO 最好使用单个表达式完全初始化字段。

当需要副作用时,您可以使用大括号来创建一个块来实现此目的,这是一个具有最后一行值的表达式:

class A(names: String*) {
  val namesBuffer: ListBuffer[String] = {
    val buffer = new ListBuffer[String]
    buffer ++= names
    buffer
  }
}

使用此技术,可以确保在完成初始化之前没有其他初始化逻辑访问 namesBuffer 的值。

类定义主体中的每个语句都成为默认构造函数主体的一部分。

在您的示例中,您可以只执行以下操作:

class A (names: String*) {
  val namesBuffer: ListBuffer[String] = new ListBuffer[String]
  namesBuffer ++= names
}

或更短:

class A (names: String*) {
  val namesBuffer: ListBuffer[String] = new ListBuffer[String] ++= names
}

或:

class A (names: String*) {
  val namesBuffer: ListBuffer[String] = ListBuffer[String](names: _*)
}

在 Scala 中,整个类定义实际上是默认的构造函数,如果这有意义的话。

你可以做这样的事情:

class A (names: String*) {
  val namesBuffer: ListBuffer[String] = new ListBuffer[String]
  namesBuffer.add(names)
}

如果名称缓冲区采用字符串数组,您也可以初始化它:

class A (names: String*) {
  val namesBuffer: ListBuffer[String] = new ListBuffer[String](names)
}

最新更新