Java中方法的最终变量

Tar*_*rik 30 java final

可能重复:
为什么在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();
Run Code Online (Sandbox Code Playgroud)

你能告诉我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

Bol*_*ock 35

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

Book物体本身仍然是可变的,如从访问的调用顺序可以看出.只有它的参考不是.


Nat*_* W. 12

在这种情况下,final Books books只意味着books必须为其分配一次值.

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

如果我没有标记变量,final那么它就会引起我的注意,因为它会很快改变价值.这些信息很有用,例如,在调试器中单步调试代码或重构和移动代码.