Java方法中的final变量

Java方法中的final变量,java,final,Java,Final,可能重复: 我在检查一些Java代码,我不擅长Java,至少对final有一些了解,比如密封类、只读字段和不可重写的方法,但这看起来很奇怪,在方法中声明了一个变量final: private static void queryGoogleBooks(JsonFactory jsonFactory, String query) throws Exception { // Set up Books client. final Books books = Books.builder(

可能重复:

我在检查一些Java代码,我不擅长Java,至少对final有一些了解,比如密封类、只读字段和不可重写的方法,但这看起来很奇怪,在方法中声明了一个变量
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
是什么意思吗

以下是完整的代码:


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


从访问器调用序列可以看出,
Book
对象本身仍然是可变的。只有对它的引用是不正确的。

我很确定这意味着,在以后的方法中,除了可变的书籍之外,没有什么东西是不能被覆盖的

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

在这种情况下,
final Books Books
仅意味着必须为
Books
指定一个值,且该值必须只指定一次

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

如果我没有将一个变量标记为
final
,那么它就非常值得关注,因为它很快就会改变值。例如,在调试器中单步执行代码或重构和移动代码时,此信息非常有用

  • 有关所有内容的进一步阅读
    最终版

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


书中所指的对象是可变的,这难道一文不值吗?@Doug:是的,我刚刚在我的答案中添加了这一点。谢谢。+1(不过是沧海一粟)
final
在这方面意味着更多。+1对于链接,非常好的解释
final
在这个上下文中意味着更多。匿名类没有对变量books的引用。如果是,则会出现编译错误,因为匿名类是在初始化变量之前创建的。