为什么书上说这里需要final?

Dea*_*erd 4 java final class

该代码来自Thinking in Java一书。我不知道为什么我必须在final这里添加语法。我删除了final,程序仍然编译。但是,书中说我必须添加它。

// initialization. A briefer version of Parcel5.java.
public class Parcel9 {
    // Argument must be final to use inside
    // anonymous inner class:
    public Destination destination(final String dest) {
        return new Destination() {
            private String label = dest;
            public String readLabel() { return label; }
        };
    }
    public static void main(String[] args) {
        Parcel9 p = new Parcel9();
        Destination d = p.destination("Tasmania");
    }
} ///:~
Run Code Online (Sandbox Code Playgroud)

ern*_*t_k 11

这本书(或章节/章节)很可能是在 Java 8 时代之前编写的。

Java 对匿名类施加了限制,匿名类可能无法访问局部变量,除非它是最终的。

在 Java 8 中,该限制也适用于 lambda 表达式。但是,除此之外,Java 8 添加了 Effective final的概念,这使得编译器更聪明,因为它检测到变量是 final 的,因为它没有在本地重新分配,从而final在这样的情况下显式使用关键字可选案件。

因此,如果您在 Java 7 或更早版本上编译该代码,您将遇到本书教读者避免的编译器错误。