局部变量在类的方法中做出最终 - 但为什么呢?

时间:2013-07-29 18:23:18

标签: java

今天在搜索谷歌的某段代码时,我遇到了一个Q / A博客,据说我们可以在一个类的方法中声明一个局部变量为final。然而,作者不愿意解释这样做的必要性/好处。

喜欢

public class A
{
 private void show()
 {
  final String s="checking";
 }
}

我会寻求java专家的帮助来教育我。在此先感谢您的支持和指导。

祝你好运!

6 个答案:

答案 0 :(得分:8)

除了其他答案之外,创建变量final还可以在类和接口的内联实现中使用该变量:

final String test = "test";

foo = new Foo() {
        public void bar() {
            System.out.println(test);
        }
    };

编辑: 如果您是初学者,也可能值得指出变量实际上是实例引用。当你创建一个变量final时,你实际上正在使引用常量,也就是说,最终变量在初始化之后永远不会引用其他实例。这并未声明实际引用的实例是否为常量。

例如,如果您说final String[] foo = { "bar", baz" }即使foo[0] = "sheep"foo 也可以<{1}} final。您不能做的是将foo变量引用到其他内容,例如foo = new String[]...foo = someOtherArray。这与可变性不变性有关,而这些概念有点类似于final,所以它们可能值得一些调查。

答案 1 :(得分:4)

变量可以放在只读存储器中,使其操作更快。

这样做也是合乎逻辑的,例如表示局部常量或确保不会意外更改某个值。这使它成为将错误转换为编译器错误的有用方法。

此外,它允许变量在内部/匿名类中使用,如其他答案所指出的那样。

答案 2 :(得分:4)

除了强制变量在初始化后保持不变之外,将变量声明为final使得方法本地内部类可以访问它。 通过查看以下一小段代码的反汇编代码,可以获得更详细的信息:

class MyFinal 
{
    public static void main(String[] args) 
    {
        String str = "java";
        final String str1 = "Hello";
    }
}

上述程序的反汇编代码如下:

J:\>javap -c MyFinal
Compiled from "MyFinal.java"
class MyFinal extends java.lang.Object{
MyFinal();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   ldc     #2; //String java
   2:   astore_1
   3:   return

}

在上面反汇编代码的main方法中,我们看到,java编译器保留了non-final变量str的String对象创建代码,但是它默认地省略了{{1}的String对象创建代码。 1}}。这是因为,final String str1 = "Hello";在任何地方都没有使用。因此,它有助于编译器优化代码,如果不使用它,可以避免不必要的对象创建。

答案 3 :(得分:2)

能够轻易地告诉变量不会改变是有意义的。如果这是一个原语,你可以认为该值是不可变的,如果不是,你现在知道该值将始终是同一个实例(可以更改哪个状态)。

这对程序的可读性很有用,这样我们就可以确保永远不会重新赋值变量。它对于匿名函数也很有用,在此解释:Why do we use final keyword with anonymous inner classes?

答案 4 :(得分:1)

  

final添加到不应该更改的所有内容中,只会缩小您(或下一个程序员,处理您的代码)会误解或误用导致的思维过程的可能性在你的代码中。

this answer转到类似的问题。

答案 5 :(得分:0)

当var为final时,您无法更改它。这意味着 - 一个你不能做的错误 - 或者,如果更确切地说,一个逻辑错误会产生编译错误,并节省长时间的调试。


不要与您无法继承的final class混淆。


more data could be found in wikipedia