如果将它放在变量之前,"final"会做什么?

Jac*_*ove 43 java

非常基本的问题,但是,如果你把它放在变量之前,那么"最终"会做什么,例如下面...

final EditText myTextField = (EditText) findViewById(R.id.myTextField);
Run Code Online (Sandbox Code Playgroud)

怎么final办?

And*_*wan 70

简答

停止将"myTextField"变量分配给其他内容.

答案很长

  • 不要停止变形的"myTextField"变量,例如将其字段设置为新值.
  • 使代码更具可读性(恕我直言),因为读者永远不必怀疑"myTextField"变量是否会在代码中稍后重新分配.
  • 防止变量被意外重新分配的bug类别(同样的原因使得实例不可变,只是在较小的范围内).

由于上面给出的原因,我总是将"final"修饰符应用于静态字段,实例字段,局部变量和方法参数.它确实使代码膨胀一点,但对我来说,值得额外的可读性和稳健性.

  • 如果它提供有用的功能,我不会认为它膨胀. (3认同)

Mic*_*yan 15

final在此上下文中,关键字意味着您无法更新隐式指针myTextField以指向其他对象(尽管您可以修改指向的对象myTextField).关键字也可用于防止覆盖(当应用于类或方法时).

您可能会看到这一点的一个原因是引用局部变量的匿名类只能引用标记的变量final.这样,匿名类只需要存储重复的引用,而不需要保持对本地函数堆栈的完全访问.例如:

Runnable r = new Runnable() { public static void run() {
         // do something with myTextField
         // this would require myTextField to have been marked final.
}};
doSomethingLater(r);
Run Code Online (Sandbox Code Playgroud)


Ste*_*n C 10

其他答案都没有注意到的一点是,final属性与Java内存模型相比具有特殊属性.实际效果是,一个线程可以安全地访问final属性的值,而无需采取步骤与其他线程同步.

跟进

JVM是否具体?

Java内存模型的规范是Java语言规范的一部分,自Java 1.5以来,(AFAIK)没有改变.从这个意义上说,这不是JVM特有的.

但是,如果您不遵守规则(即,如果您的代码未正确同步其共享数据的使用),Java的行为取决于各种各样的事情,包括您运行应用程序的硬件.

除此之外,Java内存模型旨在允许多核机器运行许多Java线程,而不必持续刷新内存缓存......这会破坏性能.基本上,它指定了一些规则,可以保证一个Java线程从另一个线程看到内存更新.如果应用程序不遵循规则,则某个线程可能会看到由某个其他线程写入的某些字段的陈旧(过时)值,从而导致偶尔出现未定义的行为.