2011-11-29 87 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

匿名类没有对变量簿的引用。如果确实存在,则会出现编译错误,因为在初始化变量之前正在创建匿名类。 –

相关问题