35

final ローカル変数を使用することの使いやすさはあるのだろうかと思っていました。継承が明らかになった場合でも、変数はオーバーライドされません。たとえば、以下のような簡単なコード

public static void main(String args[]) {
    final String data = "Hello World!";
    System.out.println(data);
}

例は非常に単純なものであり、関連するコードではないかもしれませんが、質問はより一般的です.私は多くのコードを見てきました(すべて最終的なローカル変数を持つメイン関数に組み込まれています)ローカル変数を最終的なものとして宣言することの有用性はありますか同じ機能自体で編集できないことよりも?

4

8 に答える 8

63

まず、「オーバーライド」されている変数に関する部分には、 final2 つの非常に異なる意味があります。クラスとメソッドの場合、それは継承に関するものです。変数の場合は、読み取り専用です。

final ローカル変数には重要な "機能" が 1 つあります。それらは、ローカル (通常は匿名) 内部クラスで使用できます。非最終的なローカル変数はできません。final私の経験では、これがローカル変数の主な用途です。

public void foo() {
    final String x = "hello";
    String y = "there";

    Runnable runnable = new Runnable() {
        @Override public void run() {
            System.out.println(x); // This is valid
            System.out.println(y); // This is not
        }
    };
    runnable.run();
}

スタイルの問題として、ローカルの内部クラスで変数をキャプチャしていないfinal場合でも使用することを好む人がいることに注意してください。私は確かにデフォルトであることに満足していますが、「非最終」の別の修飾子ですが、明示的に修飾子をどこにでも追加すると気が散りすぎます。final

于 2013-08-14T07:26:13.180 に答える
9

final ローカル変数は匿名の内部サブクラスからアクセスできますが、非 final ローカル変数はアクセスできません。

于 2013-08-14T07:26:15.293 に答える
8

はい、使いやすさは次のとおりです。-ローカルの最終変数は、メソッドの内部クラスからアクセスできます。ローカル変数はスタック上に存在し、メソッドの存続期間中のみ存在するため、内部クラス オブジェクトはより長く存続する可能性があるため、内部クラスは非最終ローカル変数にアクセスできません。ただし、変数が最終的なものになると、内部クラスは値が変更されないことを確認するため、最終的なローカル変数のプライベート コピーを使用のために保持します。

于 2013-08-14T07:27:10.440 に答える
6

Jon Skeetの完璧な答えですが、最終変数には別の(ほとんど)利点があります。

コンパイラは、最終変数が一度だけ設定されるようにします。

変数を初期化する必要があり、値の計算が複雑であるとしましょう (if-then-else 内の複数の if-then-else)。ある条件で変数を初期化しない (または 2 回初期化する) コードを作成する場合があります。もちろん、これはバグです。変数を final にすると、コンパイラは final 変数が一度だけ設定されていることを確認できます。そのため、バグがある場合はすぐにわかります。

私が言ったように、ほとんどメリットはありませんが、それでも便利です。

于 2013-08-14T07:52:37.540 に答える
5

はい、通常使用できる小さな例があります -

スニペット:

final Boolean data = Boolean.TRUE;
button.addListener(SWT.Selection, new Listener() {
    public void handleEvent(Event event) {
        if (data ) {
                     ....
                }
        }
});

匿名の内部クラスでの使用例です。内部カルス内でローカル変数を使用したい場合は、make する必要がありますfinal

于 2013-08-14T07:26:41.073 に答える
4

Java での final ローカル変数の使用

finalフィールド、パラメーター、およびローカル変数は読み取り専用です(オブジェクトの状態ではなく、オブジェクトの ID を意味します)。

于 2015-03-10T06:49:24.800 に答える
3

final読みやすくするためにキーワードを使用し、変更されないようにするか、次のような匿名クラスで使用できます。

    final String s = "hi";
    new Thread(new Runnable() {
        @Override
        public void run() {
            // can use s variable here
        }
    }).start();
于 2013-08-14T07:27:11.997 に答える