web-dev-qa-db-ja.com

Javaのメソッドの最後の変数

可能性のある複製:
Javaでローカル変数とメソッドパラメータを「最終」としてマークするのはなぜですか?

私はいくつかのJavaコードをチェックしていましたが、Javaは得意ではありません。少なくとも、密封されたクラス、読み取り専用フィールド、オーバーライド不可など、finalが何をするかについてある程度の知識があります。メソッドですが、これは奇妙に見え、メソッドで変数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

30
Tarik

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

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

35
BoltClock

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

このようにfinalキーワードを使用したいのは、変数の意図を示しているためです。これは、コードを見ると、状況からさらに別の変数が削除されるため、貴重な情報です。

変数をfinalとしてマークしない場合、値を変更するため、注目すべき何かとして目立ちますそのうち。この情報は、たとえば、デバッガでコードをステップ実行したり、コードをリファクタリングしたり移動したりするときに役立ちます。

12
Nate W.

同様に、これは変数参照を読み取り専用にします。通常、これは、変更してはならない変数を誤って変更することからコードを保護するためです。

4
mellamokb

それは変数booksだけがメソッドで後で上書きできないことを意味すると確信しています。

1
Me1000

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

別のメソッドで定義された内部クラス内の非最終変数を参照できません

1