2011-11-29 18 views
28

可能性の重複:
Why would one mark local variables and method parameters as “final” in Java?final変数

私はいくつかのJavaコードをチェックしていた、私は、少なくともそのような行い、最終的なものをいくつかの知識を持っているjavaのが得意ではないです密接なクラス、読み取り専用フィールド、オーバーライド不可能なメソッドがありますが、これは私には変わったようです。メソッド内で変数finalを宣言しています:

private static void queryGoogleBooks(JsonFactory jsonFactory, String query) throws Exception { 
    // Set up Books client. 
    final Books books = Books.builder(new NetHttpTransport(), jsonFactory) 
     .setApplicationName("Google-BooksSample/1.0") 
     .setJsonHttpRequestInitializer(new JsonHttpRequestInitializer() { 
      @Override 
      public void initialize(JsonHttpRequest request) { 
      BooksRequest booksRequest = (BooksRequest) request; 
      booksRequest.setKey(ClientCredentials.KEY); 
      } 
     }) 
     .build(); 

この文脈でfinalの意味は何ですか?ここで

は完全なコードです:

http://code.google.com/p/google-api-java-client/source/browse/books-cmdline-sample/src/main/java/com/google/api/services/samples/books/cmdline/BooksSample.java?repo=samples

答えて

31

それは単にローカル変数booksは不変なります。つまり、常に作成されて構築されている同じBookオブジェクトへの参照になり、別のオブジェクトまたはnullを参照するように変更することはできません。

Bookオブジェクト自体は、アクセサー呼び出しのシーケンスからわかるように、依然として変更可能です。それに対する参照だけではありません。

+1

は、それは価値がオブジェクトが*可変*ですブックスで指されるものではありませんか? –

+1

@Doug:はい、私はちょうど私の答えにそれを加えました。ありがとう。 – BoltClock

+0

+1(池の中の一滴..) –

1

これは、変数の書籍より後で、このメソッドで上書きすることはできません。

3

これも同様に、変数参照を読み取り専用にします。通常、変更してはいけない変数を誤って変更するのを防ぐためです。

+0

「最終」とはこの文脈でもっと意味します。 –

9

この場合、final Books booksは、単にbooksに1回だけ値を割り当てる必要があることを意味します。

私は変数の意図を示すように、このようなキーワードfinalを使用するのが好きです。これは、状況から別の変数を取り除く際に貴重な情報になります。

の場合は、finalと表示されますが、それはまもなく値が変更されるため目立つように目立ちます。この情報は、たとえば、デバッガでコードをステップ実行したり、コードを移動してリファクタリングする&などの場合に役立ちます。すべてのものfinalでさらに読書のために

+0

'final'はこの文脈でもっと意味します。 –

+0

リンク+1、優れた説明! – NguyenDat

1

このコードは、それが法のqueryGoogleBooks内のローカル変数を参照する匿名クラスJsonHttpRequestInitializerを、使用している、このような状況で問題があることですJsonHttpRequestInitializerのinitializeメソッドが完了する前にqueryGoogleBooksメソッドが返され、変数がクリーンアップされ、JsonHttpRequestInitializerのinitializeメソッドが失敗する可能性があります。したがって、この種の状況では変数をfinalとして宣言する必要があります。詳細はを参照してください、

Cannot refer to a non-final variable inside an inner class defined in a different method

+1

匿名クラスには変数ブックへの参照がありません。もしそうであれば、変数が初期化される前に匿名クラスが作成されているので、コンパイルエラーが発生します。 –

関連する問題