35

I was wondering is there any usability of using final local variables. Variables are not overridden anyway when inheritance comes into picture. For example a simple code as below

public static void main(String args[]) {
    final String data = "Hello World!";
    System.out.println(data);
}

The example is quite simple one and may not be a relevant code but the question is more generic.I have seen a lot of codes(all incorporated in main function which have final local variables) Is there any usability of declaring local variables as final other than that they cannot be edited in the same function itself?

4

8 回答 8

63

首先,关于变量被“覆盖”的部分 -final有两个非常不同的含义。对于类和方法,它是关于继承的;对于变量,它是只读的。

final 局部变量有一个重要的“特性”:它们可以在本地(通常是匿名的)内部类中使用。非最终局部变量不能。final根据我的经验,这是局部变量的主要用途。

public void foo() {
    final String x = "hello";
    String y = "there";

    Runnable runnable = new Runnable() {
        @Override public void run() {
            System.out.println(x); // This is valid
            System.out.println(y); // This is not
        }
    };
    runnable.run();
}

请注意,作为风格问题,有些人喜欢使用final即使他们没有在本地内部类中捕获变量。我当然会很乐意final成为默认值,但“非最终”使用不同的修饰符,但我发现在任何地方显式添加修饰符太分散注意力了。

于 2013-08-14T07:26:13.180 回答
9

final 局部变量可以从匿名内部子类访问,而非 final 局部变量则不能。

于 2013-08-14T07:26:15.293 回答
8

是的,可用性是:- 方法内部类可以访问局部最终变量。由于局部变量存在于堆栈上并且仅在方法的生命周期内存在,但内部类对象可能存在更长的时间,因此内部类无法访问任何非最终局部变量。但是一旦变量是最终的,那么内部类会确保该值不会改变,因此它会保留最终局部变量的私有副本以供使用。

于 2013-08-14T07:27:10.440 回答
6

完美的答案 Jon Skeet 但最终变量还有另一个(小)好处。

编译器将确保最终变量设置一次且仅设置一次。

假设您必须初始化一个变量并且该值的计算很复杂(if-then-else 中的多个 if-then-else)。您可能会编写在某些情况下不初始化变量的代码(或将其初始化两次)。当然,这是一个错误。将变量设为 final 将允许编译器检查最终变量是否设置一次且仅一次。因此,如果您有错误,您将很快知道。

正如我所说,好处不大,但仍然很方便。

于 2013-08-14T07:52:37.540 回答
5

是的,有一个小例子,我们通常可以使用它 -

片段

final Boolean data = Boolean.TRUE;
button.addListener(SWT.Selection, new Listener() {
    public void handleEvent(Event event) {
        if (data ) {
                     ....
                }
        }
});

它是使用匿名内部类的示例。如果你想在内部类中使用你的局部变量,你必须 make final.

于 2013-08-14T07:26:41.073 回答
4

java中final局部变量的使用

final字段、参数和局部变量是只读的(表示对象的身份,而不是其状态)。

于 2015-03-10T06:49:24.800 回答
3

您可以使用final关键字来提高可读性并确保它没有被修改或在匿名类中,如下所示:

    final String s = "hi";
    new Thread(new Runnable() {
        @Override
        public void run() {
            // can use s variable here
        }
    }).start();
于 2013-08-14T07:27:11.997 回答
3

它告诉其他程序员,无论谁编写它,都知道数据的值一旦分配就不应改变。我认为这是一个好习惯,尤其是将参数变量声明为final

于 2013-08-14T07:28:20.337 回答