2013-09-04 13 views
19

プライベートvarコンストラクタパラメータとval/varのないコンストラクタパラメータの違いは何ですか?スコープ/可視性の点で同じですか?Scalaコンストラクタパラメータ

例:

class Person(private var firstName:String, lastName:String) 
+0

この質問をチェックしてください:http://stackoverflow.com/questions/15639078/scala-class-constructor-parameters – danielkza

+0

これは良い説明です:http://stackoverflow.com/questions/14694712/do-scala-コンストラクタパラメータ-define-to-private-val – lcn

答えて

24

はい、二つの重要な違いがあります。最初の簡単な方法は、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を参照してください。

+1

'def fullName'の例のような状況では、' private val' **とキーワードなしパラメータの間に違いはありませんか? – RussAbbott

1

あなたのクラスがケースクラスの場合、すべてのコンストラクタパラメータは自動的にパブリックフィールドになります。

コンパイラはプライベートキーワードが存在する場合、およびval/varのないパラメータについては、それらが使用されているかどうかに関係なく、パブリックフィールドが生成されます。

関連する問題