2011-11-29 89 views
28

可能重複:
Why would one mark local variables and method parameters as 「final」 in Java?在Java方法最後一個變量

我檢查一些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

'final'在這方面意味着更多。 – 2011-11-29 05:51:12

9

在這種情況下,final Books books僅僅意味着books必須被賦值一次。

我喜歡使用final這個關鍵字,因爲它顯示了變量的意圖,我發現它在查看代碼時是有價值的信息,因爲它從局勢中刪除了另一個變量......可以這麼說。

如果我不要將變量標記爲final那麼它會突出顯示,因爲它會在不久的將來改變值。這些信息很有幫助,例如,逐步調試調試器中的代碼或重構代碼。

+0

'final'在這方面意味着更多。 – 2011-11-29 05:50:49

+0

+1爲鏈接,優秀解釋! – NguyenDat

1

該代碼使用匿名類JsonHttpRequestInitializer,它指的是局部變量的方法queryGoogleBooks,在這種情況下的問題是, queryGoogleBooks方法可能在JsonHttpRequestInitializer的初始化方法完成之前返回,它可以清理變量並可能導致JsonHttpRequestInitializer的初始化方法失敗。所以在這種情況下需要聲明變量是最終的。欲瞭解更多詳情,請參閱,

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

+1

匿名類沒有對變量簿的引用。如果確實存在,則會出現編譯錯誤,因爲在初始化變量之前正在創建匿名類。 –

相關問題