Javaのfinal修飾子
メンバ変数や定数定義以外でfinal修飾子を使う場合の覚え書きです。
ローカル変数、引数のfinal指定
- 変更(再代入)不可になる。
- 参照型の場合、メンバ変数は変更可能。
private void function(final int num) {
num = 3; // NG.
final int v1 = 1;
v1 = 2; // NG.
final int v2;
v2 = 2; // 初回なのでOK.
v2 = 3; // NG.
}
無名クラスからの参照
- ローカル変数、引数のfinal指定は、メソッド内の無名クラスでも参照できる。
実際には変数にアクセスしているのではなく、変数の値をコピーして無名クラスのコンストラクタに見えない引数として渡している
とのこと。
private void function(final int num) {
final int v1 = 1;
int v2 = 2;
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
if (v1 == 1) {
// OK. v1を参照できる.
}
if (v2 == 1) {
// NG. v2は参照できない.
}
}
});
thread.start();
}