2016-10-03 4 views
4

明示的に宣言しない限りvalfinalではないことがわかっています。javapを使用すると、スカラックがバイトコードにfinalを挿入していないことが確認されます。valはどのように不変ですか?

したがって、valは、コンパイラがそれを変更しようとするコードを記述するのを止めてしまうため、変更不可能ですか?

valは、あなたが最初の宣言の後、それに何かを割り当てることにより、変数を変更(変異させる)ことができないことを意味:

+1

'val'sが' final'でない理由を[this](http://stackoverflow.com/a/13428362/1263942)で確認してください: –

答えて

8

finalと不変性は、2つの直交概念ですそれはによって実装されますJVMバイトコードで

val x = 1 
x = 2 // error: reassignment to val 

プライベートメンバーとゲッターを作成しますが、セッターではない:

class A { 
    val x = 1 
} 

=> 

// Java equivalent of a generated bytecode 
public class A { 
    private final int x; 
    public int x() { return x; } 
    ... 
} 

finalは、」あなたができることを意味しますトンサブクラスであなたのvalをオーバーライドする:あなたはvarの代わりvalを使用する場合

class A { 
    final val x = 1 
} 

class B extends A { 
    override val x = 2 
} 

// error: overriding value x in class A of type Int(1); 
// value x cannot override final member 

finalは、同じエラーが発生します。

+0

残念ながら、Javaはこれらの最終的な使用方法を融合していますJavaから来るものは、最初は混乱する可能性があります。 – Phasmid

+0

@Victor、コメントありがとう。だから私は、 'val'に' setter 'を実装することを許さないので、 'val'が不変構造であることについて私の質問に答えていますか? – JamieP

+0

Scalac自体はvalのためのセッターを実装していません。それは事実上不変です。 Javaの最終的なフィールドでさえ、あなたが十分に頑張っていれば、反射で突然変異することがあります。 –

関連する問題