Do scala constructor parameters default to private val?
scala, scala-primary-constructor
Solution
`bar: Int`
This is barely a constructor parameter. If this variable is not used anywhere except the constructor, it remains there. No field is generated. Otherwise `private val bar` field is created and value of `bar` parameter is assigned to it. No getter is created.
`private val bar: Int`
Such declaration of parameter will create `private val bar` field with private getter. This behavior is the same as above no matter if the parameter was used beside the constructor (e.g. in `toString()` or not).
`val bar: Int`
Same as above but Scala-like getter is public
`bar: Int` in case classes
When case classes are involved, by default each parameter has `val` modifier.
Problem
I have been trying: ``` class Foo(bar: Int) ``` vs: ``` class Foo(private val bar: Int) ``` and they seem to behave the same although I couldn't find anywhere saying that `(bar: Int)` expands to `(private val bar: Int)` so my question is, are these identical/similar? On a side note, I have been trying to use `-Xprint:typer` on these code pieces and they produce the same code except for an extra line in the second one. How do I read that extra line? ``` .. class Foo extends scala.AnyRef { <paramaccessor> private[this] val bar: Int = _; def <init>(bar: Int): this.Foo = { Foo.super.<init>(); () } } .. .. class Foo extends scala.AnyRef { <paramaccessor> private[this] val bar: Int = _; <stable> <accessor> <paramaccessor> private def bar: Int = Foo.this.bar; def <init>(bar: Int): this.Foo = { Foo.super.<init>(); () } } .. ```