Вопрос по constructor – конструкторы в Scala (основной / вспомогательный / основной по умолчанию)

11

Довольно простое упражнение изCay Horstmann's книга« Scala for the impatient » продолжает озадачивать меня Это оprimary,auxiliary а такжеdefault primary Конструкторы & # xA0 ;:

ex 5.10 : Consider the class

<code>class Employee(val name: String, var salary: Double) {
  def this() { this("John Q. Public", 0.0) }
}
</code>

Rewrite it to use explicit fields and a default primary constructor.

Я не уверен, что должен делать. Могут ли некоторые из вас предложить решение & # xA0 ;?

Однако попытка выполнить это упражнение, возможно, заставила меня осознать то, что я раньше не замечал о первичном конструкторе иval поля (как вы можете видеть, я не совсем уверен) & # xA0 ;:

Прав ли я, если скажу, чтоval поле (какname вEmployee класс выше) может быть инициализирован только черезprimary конструктор, а неauxiliary один ? В последнем случае это будет рассматриваться компилятором как переназначениеval поле, вызывающее ошибку.

Сначала я подумалval Поля как грубый эквивалент окончательных полей в Java, ожидая, что было бы законно назначать их впервые в любом конструкторе, но, похоже, я ошибался.

Я не совсем удовлетворен тем, что может быть только диким предположением, поэтому я был бы признателен, если бы кто-то мог дать мне более точную информацию по этому вопросу.

У меня был точный вопрос из того же упражнения. Возможно, меня смущает то, что автор подразумевает под "явным". vmayer

Ваш Ответ

2   ответа
11

ентов, например:

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      
}

Понятно, что это уступает определению полей в основном конструкторе, что я и хотел сделать.

Большое спасибо за то, что нашли время прояснить цель упражнения. Также большое спасибо за вашу книгу, которая дополняет книгу Мартина Одерского и делает больше, чем любую другую книгу по этому вопросу, первые шаги в Scala более простыми и более приятными. Jerome ROBERT
13

In Scala, every auxiliary constructor must invoke another constructor of the same class as its first action. The net effect of this rule is that every constructor invocation in Scala will end up eventually calling the primary constructor of the class. The primary constructor is thus the single point of entry of a class.

Итак, все данные для инициализацииval должен быть в основном конструкторе.

Ваш класс с явными полями может быть что-то вроде:

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

или без значений параметров по умолчанию:

class Employee(n: String, s: Double) {
  def this() = this("John Q. Public", 0.0)
  val name = n
  var salary = s
}
Спасибо за ваш ответ. Я пришел к решению, очень близкому к вашему, но подумал, что оно не соответствует цели упражнения, так как я подумал, что «основной конструктор по умолчанию» был "явно не объявленным тупым конструктором без параметра". Jerome ROBERT

Похожие вопросы