A quite simple exercise from Cay Horstmann’s book « Scala for the impatient » keeps puzzling me. It’s about primary,auxiliary and default primary constructors :
ex 5.10 :
Consider the class
class Employee(val name: String, var salary: Double) {
def this() { this("John Q. Public", 0.0) }
}
Rewrite it to use explicit fields and a default primary constructor.
I’m not sure about I am supposed to do. Could some of you propose a solution ?
However, trying to solve this exercise may have made me aware of something I hadn’t noticed before about primary constructor and val fields (as you can see, I’m not quite sure) :
Am I right if I say that a val field (as name in the Employee class above) may only be initialized through the primary constructor and not by an auxiliary one ? In the latter case it would be considered by the compiler as a reassignment to a val field causing an error.
At first I thought to val fields as a rough equivalent to final fields in java expecting that it would be legal to assign them for the first time in any constructor but it seems I was wrong.
I am not quite satisfied with what may only be a wild guess so I would appreciate if someone could give me more accurate information about that point.
From “Programming in Scala, 2nd edition” paragraph 6.7:
So all data for initialization of
valmust be in primary constructor.Your class with explicit fields may be something like:
or without default parameter values: