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>(); () } } .. ```

Original source