final修飾子

      2018/05/24

メンバ変数や定数定義以外で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();
}

 - Java