6

私は scala を初めて使用するので、クラスのコンストラクターを含む次のコード スニペットを明確にする必要があります。

class sample (a: Int, b: Int) {
/* define some member functions here */
}

変数abクラス専用にすることはできますsampleか?

class sample (val a: Int, val b: Int) {
/* define some member functions here */
}

この場合、aパブリックbにアクセス可能ですか? valコンストラクターのパラメーター リストにキーワードを追加することの正確な効果は何ですか? defの代わりにキーワードを使用するvalと、同じ効果がありますか?

4

2 に答える 2

7
class sample (a: Int, b: Int)

この場合、aとbはプライベートです。javapで逆アセンブルすると、aとbがクラスの一部ではないことがわかります(Scalaはこれらのクラスフィールドを呼び出します):

public class Sample extends java.lang.Object implements scala.ScalaObject{
    public Sample(int, int);
}

aとbの前にvalが付きます。javapで逆アセンブルすると、aとbがSampleのパブリックフィールドになります。

class sample (val a: Int, val b: Int)

public class Sample extends java.lang.Object implements scala.ScalaObject{
    public int a();
    public int b();
    public Sample(int, int);
}

defコンストラクターの代わりにを使用valすると、コンパイルされません。def関数を定義するためのものです。defコンストラクターでパラメーターとして使用できるかどうかわからない。

また、プライベートおよび保護されたものは期待どおりに動作することに注意してください。これを考えると:

class Sample(private val a: Int, protected val b: Int, val c: Int)

javapを使用して次のように分解します。

public class Sample extends java.lang.Object implements scala.ScalaObject{
    public int b();
    public int c();
    public Sample(int, int, int);
}
于 2012-10-06T07:34:52.590 に答える