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变量