在java中使用最终局部变量

时间:2013-08-14 07:24:28

标签: java final local-variables

我想知道是否有使用最终局部变量的可用性。当继承进入图像时,无论如何都不会覆盖变量。例如,下面的简单代码

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

示例非常简单,可能不是相关的代码,但问题更通用。我看过很多代码(所有代码都包含在main函数中,它们都有最终的局部变量)是否有任何声明局部变量的可用性除了它们之外,它们不能在同一个函数中编辑?

8 个答案:

答案 0 :(得分:59)

首先,关于变量“被覆盖”的部分 - 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作为默认值感到满意,但对于“非最终版”却是一个不同的修饰符,但我发现在任何地方明确添加修饰符太过分散注意力。

答案 1 :(得分:9)

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

答案 2 :(得分:8)

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

答案 3 :(得分:5)

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

<强>段

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

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

答案 4 :(得分:5)

完美答案Jon Skeet但是最终变量还有另外一点好处。

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

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

正如我所说,收效甚微,但仍然很方便。

答案 5 :(得分:4)

  

在java中使用最终局部变量

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

答案 6 :(得分:3)

您可以使用final关键字来提高可读性并确保它不被修改,或者使用匿名类,例如:

    final String s = "hi";
    new Thread(new Runnable() {
        @Override
        public void run() {
            // can use s variable here
        }
    }).start();

答案 7 :(得分:3)

它告诉其他程序员,无论谁编写它都知道 data 的值一旦分配就不会改变。在我看来,这是一个很好的习惯,特别是将参数变量声明为 final