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