为什么书说这里需要决赛?

问题描述 投票:3回答:2

该代码来自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");
    }
} ///:~
java class final
2个回答
3
投票

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

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

在Java 8中,该限制也适用于lambda表达式。但是,除此之外,Java 8还添加了[[finally final的概念,这使编译器由于未在本地重新分配变量而检测到该变量是最终变量,从而使之更加智能。在这种情况下,final关键字是可选的。

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

0
投票
方法参数声明中的final表示不应在方法主体中重新分配特定变量,并增加代码的可读性,因此,如果偶然发生,您将得到编译器错误
© www.soinside.com 2019 - 2024. All rights reserved.