Я пытался:
class Foo(bar: Int)
против:
class Foo(private val bar: Int)
и они, кажется, ведут себя одинаково, хотя я не мог найти нигде, говорящего, что (bar:
Int)
расширяется до, (private val bar: Int)
поэтому мой вопрос: идентичны ли они / похожи?
Кстати, я пытался использовать -Xprint:typer
эти фрагменты кода, и они производят тот же код, за исключением дополнительной строки во втором. Как мне прочитать эту лишнюю строчку?
..
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>();
()
}
}
..
val
.var
доступен и имеет смысл для рендеринга параметров конструктора в (изменяемые) свойства класса как в не-, такcase
и вcase
классах.bar: Int
скомпилировано вprivate[this] val bar: Int
В первом случае
bar
это только параметр конструктора. Поскольку главный конструктор является содержимым самого класса, он доступен в нем, но только из этого самого экземпляра. Так что это почти эквивалентно:С другой стороны, во втором случае
bar
это обычное частное поле, поэтому оно доступно для этого экземпляра и других экземпляровFoo
. Например, это нормально компилируется:И работает:
Но это не так:
источник
bar: Int
иprivate val ...
.