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();
}
このエントリーをはてなブックマークに追加
にほんブログ村 IT技術ブログへ

スポンサードリンク

関連コンテンツ

コメント

メールアドレスが公開されることはありません。 が付いている欄は必須項目です