プライベートvarコンストラクタパラメータとval/varのないコンストラクタパラメータの違いは何ですか?スコープ/可視性の点で同じですか?Scalaコンストラクタパラメータ
例:
class Person(private var firstName:String, lastName:String)
プライベートvarコンストラクタパラメータとval/varのないコンストラクタパラメータの違いは何ですか?スコープ/可視性の点で同じですか?Scalaコンストラクタパラメータ
例:
class Person(private var firstName:String, lastName:String)
はい、二つの重要な違いがあります。最初の簡単な方法は、var
またはval
キーワードのないコンストラクタパラメータは変更可能な変数ではなく、その値をクラスの本文で変更することはできません。
val
キーワードに制限しても、private val
とキーワードなしのパラメータには相違があります。次のことを考えてみましょう:私たちはjavap -v Person
でコンパイルされたクラスを見れば
class Person(private val firstName: String, lastName: String)
、我々はfirstName
のために、それだけで一つのフィールドを持っていることがわかります。 lastName
は、コンストラクタパラメータです。つまり、クラスの初期化後にガベージコレクションされる可能性があります。
コンパイラは、初期化後にlastName
の値が必要なことを知るのに十分スマートです。その場合のフィールドです。
class Person(private val firstName: String, lastName: String) {
def fullName = firstName + " " + lastName
}
コンパイラは、それは後でlastName
の値が必要な場合がありますことを伝えることができ、我々は再びjavap
をチェックすると、我々はクラスが二つのフィールド(我々が定義されたい場合は、その点に注意してくださいを持っていることがわかります:以下のバリエーションを考えてみましょうdef
の代わりにval
としてfullName
を入力すると、1つのフィールドのみが表示されます)。
最後に、我々はfirstName
オブジェクト・プライベート代わりクラスのプライベート、それはまさに昔ながらのキーワードレスコンストラクタのパラメータと同じように動作の作ればことに注意してください:
class Person(private[this] val firstName: String, lastName: String)
をこれでもvar
で動作します代わりにval
の:
class Person(private[this] var firstName: String, lastName: String)
これらのクラスは両方とも、何のフィールドを持っていません。オブジェクトプライベートアクセスの詳細については、the language specificationのセクション5.2を参照してください。
'def fullName'の例のような状況では、' private val' **とキーワードなしパラメータの間に違いはありませんか? – RussAbbott
あなたのクラスがケースクラスの場合、すべてのコンストラクタパラメータは自動的にパブリックフィールドになります。
コンパイラはプライベートキーワードが存在する場合、およびval/varのないパラメータについては、それらが使用されているかどうかに関係なく、パブリックフィールドが生成されます。
この質問をチェックしてください:http://stackoverflow.com/questions/15639078/scala-class-constructor-parameters – danielkza
これは良い説明です:http://stackoverflow.com/questions/14694712/do-scala-コンストラクタパラメータ-define-to-private-val – lcn