Java中方法的最终变量

可能重复:
为什么在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

它只是使局部变量books不可变。 这意味着它将始终是对创建和构建的同一Book对象的引用,并且不能更改为引用另一个对象,或者为null。

从访问者调用序列可以看出, Book对象本身仍然是可变的。 只有它的参考不是。

在这种情况下, final Books books只是意味着books必须只分配一次价值。

我喜欢使用这样的final关键字,因为它显示了变量的意图,在查看代码时我发现它是有价值的信息,因为它从情境中删除了另一个变量……可以这么说。

如果我没有将变量标记为final变量那么它就会引人注目,因为它会很快改变数值。 这些信息很有用,例如,在调试器中单步执行代码或重构和移动代码。

  • 关于所有事情的进一步阅读: 最终关键字的最后一句话

这同样使变量参考只读。 通常,这是为了防止代码意外修改不得更改的变量。

我很确定这仅仅意味着变量不能在以后的方法中被覆盖。

这段代码使用匿名类JsonHttpRequestInitializer,它引用方法queryGoogleBooks中的局部变量,这种情况下的问题是queryGoogleBooks方法可以在jsonHttpRequestInitializer的initialize方法完成之前返回,它可以清理变量并且可以导致JsonHttpRequestInitializer的initialize方法失败。 因此,在这种情况下,需要将变量声明为final。 有关详细信息,请参阅,

不能引用在不同方法中定义的内部类中的非final变量