I parametri del costruttore di scala sono predefiniti come valore privato?

Ci ho provato:

class Foo(bar: Int) 

vs:

 class Foo(private val bar: Int) 

e sembrano comportarsi allo stesso modo anche se non sono riuscito a trovare da nessuna parte che (bar: Int) espande a (private val bar: Int) quindi la mia domanda è, sono identici / simili?

In una nota a -Xprint:typer , ho cercato di utilizzare -Xprint:typer su questi pezzi di codice e producono lo stesso codice tranne che per una riga aggiuntiva nella seconda. Come leggo quella linea in più?

 .. class Foo extends scala.AnyRef {  private[this] val bar: Int = _; def (bar: Int): this.Foo = { Foo.super.(); () } } .. .. class Foo extends scala.AnyRef {  private[this] val bar: Int = _;    private def bar: Int = Foo.this.bar; def (bar: Int): this.Foo = { Foo.super.(); () } } .. 

    bar: Int

    Questo è a malapena un parametro costruttore. Se questa variabile non viene utilizzata da nessuna parte eccetto il costruttore, rimane lì. Nessun campo è generato. Altrimenti viene creato un campo private val bar e viene assegnato il valore del parametro bar . Nessun getter è stato creato.

    private val bar: Int

    Tale dichiarazione di parametro creerà private val bar campo private val bar privato con getter privato. Questo comportamento è lo stesso di sopra, indipendentemente dal fatto che il parametro sia stato utilizzato accanto al costruttore (ad esempio in toString() o meno).

    val bar: Int

    Come sopra ma getter alla scala è pubblico

    bar: Int in caso di classi

    Quando sono coinvolte classi di casi, per impostazione predefinita ogni parametro ha un val modificatore.

    Nel primo caso, la bar è solo un parametro costruttore. Poiché il costruttore principale è il contenuto della class stessa, è accessibile in esso, ma solo da questa stessa istanza. Quindi è quasi equivalente a:

     class Foo(private[this] val bar:Int) 

    D’altra parte, nel secondo caso la bar è un normale campo privato, quindi è accessibile a questa istanza e ad altre istanze di Foo . Ad esempio, questo compila bene:

     class Foo(private val bar: Int) { def otherBar(f: Foo) { println(f.bar) // access bar of another foo } } 

    E corre:

     scala> val a = new Foo(1) a: Foo = [email protected] scala> a.otherBar(new Foo(3)) 3 

    Ma questo non:

     class Foo(bar: Int) { def otherBar(f: Foo) { println(f.bar) // error! cannot access bar of another foo } }