私はいくつかの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
の意味を教えてください。
完全なコードは次のとおりです。
単にローカル変数books
を不変にします。つまり、作成および構築される同じBook
オブジェクトへの参照となり、別のオブジェクトまたはnullを参照するように変更することはできません。
Book
オブジェクト自体は、一連のアクセサー呼び出しからわかるように、依然として変更可能です。それへの参照のみではありません。
この場合、 final Books books
は単にbooks
に値を1回だけ割り当てる必要があることを意味します。
このようにfinal
キーワードを使用したいのは、変数の意図を示しているためです。これは、コードを見ると、状況からさらに別の変数が削除されるため、貴重な情報です。
変数をfinal
としてマークしない場合、値を変更するため、注目すべき何かとして目立ちますそのうち。この情報は、たとえば、デバッガでコードをステップ実行したり、コードをリファクタリングしたり移動したりするときに役立ちます。
final
: 最後のキーワードの最後の単語同様に、これは変数参照を読み取り専用にします。通常、これは、変更してはならない変数を誤って変更することからコードを保護するためです。
それは変数booksだけがメソッドで後で上書きできないことを意味すると確信しています。
このコードは匿名クラスJsonHttpRequestInitializerを使用しており、queryGoogleBooksメソッドのローカル変数を参照しています。この種の状況での問題は、JsonHttpRequestInitializerのinitializeメソッドが完了する前にqueryGoogleBooksメソッドが返され、変数をクリーンアップして、 JsonHttpRequestInitializerのinitializeメソッドを失敗させます。したがって、このタイプの状況では、変数をfinalとして宣言する必要があります。詳細については、