0

一部のJavaIDEには、ユーザーに尋ねることさえせずに物事を最終的にするというこのルールがあることがわかりました。たとえば、「final」キーワードがないファイルを開くだけで、IDEはそれらの束をあちこちに、特に変数に挿入します。

私の主張は常に「IDEがアルゴリズムでそれを実行できるのであれば、JVMも実行できる」というものでした。

この議論は水を保持しますか?Java開発者はいつ「final」キーワードを使用する必要がありますか?最終的になる可能性のあるすべての変数をそのように宣言する必要がありますか?

ありがとう!

4

4 に答える 4

13

私の主張は常に「IDEがアルゴリズムでそれを実行できるのであれば、JVMも実行できる」というものでした。

この議論は水を保持しますか?

いいえ。IDEがそれを行うとき(そして、そのように明示的に構成することはできますが、デフォルトで尋ねることなくそれを行うことはありません)、開発者はそれが本当に彼らが望んでいた決定であるかどうかを確認できます。これにより、他のコードが開発者の意向に反することを防ぐことができます。

それが実行時にのみ行われた場合、それは目的全体を無効にするでしょう。他のコードがフィールドを変更できないようにフィールドを作成した場合final、他のコードがフィールドを変更しようとすると、コンパイル時エラーが発生します。それがJVMに任されているだけなら、私はそれを変更しないコードに頼ることはできません。

Java開発者はいつ「final」キーワードを使用する必要がありますか?

フィールドの場合、フィールドがコンストラクターで初期化され、その後変更されないことを意図している場合。

クラスの場合、クラスがサブクラス(IMO)になるように設計していない場合。

メソッドの場合、メソッドをオーバーライドするサブクラスのコードを設計していない場合。

ローカル変数の場合、匿名内部クラスの変数にアクセスします。(もちろん、他のローカル変数にも使用できます。私はそうする傾向はありませんが、そうする人もいます。もちろん、その違いは、メソッド外のコードには表示されません。)

于 2013-03-25T14:08:36.353 に答える
1

あなたは漠然としすぎています、finalは多くのことを意味します:http: //en.wikipedia.org/wiki/Final_(Java)

また、この関連するディスカッションを参照してください:https ://softwareengineering.stackexchange.com/questions/115690/why-declare-final-variables-inside-methodsこれは次の記事にリンクしています。

http://www.javapractices.com/topic/TopicAction.do?Id=23

最後のキーワードを自由に使用して、意図を伝えます。最後のキーワードには複数の意味があります:

  • 最終クラスは拡張できません
  • 最終的なメソッドはオーバーライドできません
  • 最終フィールド、パラメーター、およびローカル変数は、一度設定すると値を変更できません

最後のケースでは、プリミティブの「値」は通常の意味で理解されますが、オブジェクトの「値」はオブジェクトの状態ではなく、オブジェクトのIDを意味します。最終的なオブジェクト参照のIDが設定されると、その状態は変更できますが、IDは変更できません。プリミティブフィールドをfinalとして宣言すると、そのフィールドのスレッドセーフが自動的に保証されます。

ほとんどの場合、これは望ましい動作であるため、パラメータをfinalとして宣言する習慣があります。他の人はこれが冗長であり、実際の利益はほとんどないと感じています。

ローカル変数でfinalを一貫して使用することも(適切な場合)便利です。これは、通常、より多くのロジックが関連付けられている非最終ローカル変数(たとえば、結果変数、アキュムレータ、ループ変数)に注意を向けます。多くの人がこれを冗長だと感じています。合理的なアプローチは、メソッドに少なくとも1つの非finalローカル変数がある場合にのみ、ローカル変数にfinalを使用することです。これは、非最終ローカル変数を他の変数からすばやく区別するのに役立ちます。

ファイナルを使用する:

  • あなたの意図を明確に伝えます
  • コンパイラと仮想マシンがマイナーな最適化を実行できるようにします
  • 動作がより単純なアイテムに明確にフラグを立てます。finalは、「複雑さを探している場合、ここでは見つかりません」と述べています。
于 2013-03-25T14:11:14.783 に答える
0

ローカル変数は、がである場合にのみ内部クラスで使用できますfinal

モディファイアはfinal、セッターメソッドのスリップから身を守るために使用できます。

public void setLimit(int limit) {
    /*this.*/limit = limit;
}

明らかに間違っています。入れるthis.必要がありました。のように使用finalする

public void setLimit(final int limit) {
    limit = limit;
}

それをコンパイルエラーに変えます。

于 2013-03-25T14:23:58.663 に答える
0

最終的になる可能性のあるすべての変数をそのように宣言する必要がありますか?

はい。

多くの人は、一般的な問題を回避するためにコンパイラがどれだけできるかを理解していません。

// Final parameters cannot be reassigned.  This sometimes happens accidentally
// and sometimes because people see them as convenient local variables.
publc void myFunction(final int myIntParam) {

    // Let's declare a local variable
    final String myLocalString;

    // ... there's some code here ...

    // Here, the compiler knows whether this variable has been assigned
    // The programmer knows that it has been assigned only once
    return myLocalString.toUpperCase(Locale.ENGLISH);
}
于 2013-03-25T14:29:43.353 に答える