class A (names: String*) {
val namesBuffer: ListBuffer[String] = new ListBuffer[String]
}
我想知道,如何在创建对象时将 names 数组的名称从主构造函数参数添加到 namesBuffer 字段?我是否必须创建一个辅助构造器才能这样做,还是有另一种方法告诉 Scala 在主构造器中执行操作?
注意:上面的例子是虚构的,我只是想知道,我怎样才能告诉主构造函数做一些比分配字段更多的操作。
class A (names: String*) {
val namesBuffer: ListBuffer[String] = new ListBuffer[String]
}
我想知道,如何在创建对象时将 names 数组的名称从主构造函数参数添加到 namesBuffer 字段?我是否必须创建一个辅助构造器才能这样做,还是有另一种方法告诉 Scala 在主构造器中执行操作?
注意:上面的例子是虚构的,我只是想知道,我怎样才能告诉主构造函数做一些比分配字段更多的操作。
类定义主体中的每个语句都成为默认构造函数主体的一部分。
在您的示例中,您可以这样做:
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: _*)
}
正如 axel22 的回答所示,您可以在类主体的任何位置执行这些操作。
但是,使用单个表达式完全初始化该字段是 IMO 的好习惯。
当需要副作用时,您可以使用花括号制作一个块来实现此目的,这是一个具有最后一行值的表达式:
class A(names: String*) {
val namesBuffer: ListBuffer[String] = {
val buffer = new ListBuffer[String]
buffer ++= names
buffer
}
}
使用这种技术,您可以确保namesBuffer
在完成初始化之前没有其他初始化逻辑访问该值。
在 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)
}