2012-03-28 7 views
0

ローカル変数がメソッドの引数でも内部メソッドでも最終的になるのはなぜですか?ローカル変数はなぜ最終的なのですか?

private void add(final int a , final int b) { 
    final int c = 0; 
} 

は誰clarify.iは多くのことを探していますが、私は正確な答えを見つけることができませんでした。

+3

[最終としての機能の宣言パラメータ?:なぜそれが必要なとき]の可能複製(http://stackoverflow.com/questions/8187859/declaring-それが必要なときの関数のパラメータ) – assylias

+0

このリンクを参照すると、オブジェクトがパラメータとして渡された場合に実際に保存され、このリンクを読んだ後にプリミティブ型の代わりに例を挙げれば、本当の利点が見えます。 http://stackoverflow.com/questions/40480/is-java-pass-by-reference – kosa

+0

@thinksteep私は本当にそこにあなたに従っていないよ。 「最終」は、それをパラメータに追加するときには全く影響がありません(すべての文脈で真実である明らかなものとは別に)。 – Voo

答えて

0

機能的なスタイルは、最終的な変数を使用しています。これが一つの理由です。もう一つはクロージャーです。

最終変数は閉鎖で使用することができる唯一のものです。あなたはこのような何かをしたいのであれば:

void myMethod(int val) { 
    MyClass cls = new MyClass() { 
     @override 
     void doAction() { 
      callMethod(val); // use the val argument in the anonymous class - closure! 
     } 
    }; 
    useClass(cls); 
} 

コンパイラは最終であることをvalを必要とし、これは、コンパイルされません。そのため、メソッドのシグネチャを

void myMethod(final int val) 

に変更すると問題が解決します。ローカルfinal変数は、ちょうど同様に行います。

void myMethod(int val) { 
    final int val0; 
    // now use val0 in the anonymous class 
6

一つの理由は、それはあなたが誤ってそれらを変更しないようです。それは難しいコーディングミスを捕まえるので、良い方法です。

第二の理由は、あなたが内部クラスを使用している場合、外側のスコープから参照される変数がfinalとして宣言する必要があるということです。詳細は、this SO answerを参照してください。

finalの問題点は、異なるコンテキストで異なるものを意味していることです。詳細については、this discussionを参照してください。これらの例で

+4

IMHOまた、読みやすさも低下します。すべてのパラメータとローカル変数でそれを行うのが賢明かどうかはわかりません。 –

+0

第2の理由は、最終的なものでない場合、内部クラスは、後で変更されたかどうかを知ることができないからです。 – ControlAltDel

+0

は必須ではありませんか? –

0

最終的には、単に値を変更することはできないことを意味します。最終的な変数のいずれかに別の値を設定しようとすると、コンパイル時にエラーになります

関連する問題