scala中的构造函数(主要/辅助/默认主要)

Jer*_*ERT 11 constructor scala

Cay Horstmann的"Scala for the impatient"的一个非常简单的练习让我感到困惑.这是关于primary,auxiliarydefault primary构造函数:

ex 5.10: 考虑上课

class Employee(val name: String, var salary: Double) {
  def this() { this("John Q. Public", 0.0) }
}
Run Code Online (Sandbox Code Playgroud)

重写它以使用显式字段和默认主构造函数.

我不确定我应该这样做.你们有些人可以提出解决方案吗?

但是,试图解决这个练习可能让我意识到我之前没有注意到关于主构造函数和val字段的东西(你可以看到,我不太确定):

如果我说一个val字段(如上面nameEmployee类)只能通过primary构造函数初始化而不是一个字段,我是对的auxiliary吗?在后一种情况下,编译器将其视为对val导致错误的字段的重新分配.

起初我认为val字段是java中最终字段的粗略等价,期望在任何构造函数中第一次分配它们是合法的,但似乎我错了.

我对这可能只是一个疯狂的猜测并不十分满意,所以如果有人能给我更准确的信息,我会很感激.

Ser*_*nko 14

来自"斯卡拉编程,第2版"第6.7段:

在Scala中,每个辅助构造函数必须调用与其第一个操作相同的类的另一个构造函数.此规则的最终效果是Scala中的每个构造函数调用最终都会最终调用该类的主构造函数.因此,主要构造函数是类的单个入口点.

因此,初始化的所有数据val必须在主构造函数中.

具有显式字段的类可能类似于:

class Employee(n: String = "John Q. Public", s: Double = 0.0) {
  val name = n
  var salary = s
}
Run Code Online (Sandbox Code Playgroud)

或没有默认参数值:

class Employee(n: String, s: Double) {
  def this() = this("John Q. Public", 0.0)
  val name = n
  var salary = s
}
Run Code Online (Sandbox Code Playgroud)


cay*_*ann 12

实际上,我想到的是一个带有无参数主构造函数的版本,如下所示:

class Employee {
  private var _name = "John Q. Public"
  var salary = 0.0
  def this(n: String, s: Double) { this(); _name = n; salary = s; }
  def name = _name      
}
Run Code Online (Sandbox Code Playgroud)

显然,这不如定义主构造函数中的字段,这是我想要做的.

  • 非常感谢您花时间澄清练习的目标.同时非常感谢你的书,这本书与Martin Odersky的相辅相成,并且比其他任何一本关于这个主题的书都更加简单,Scala的第一步更简单,更有趣. (2认同)