非常基本的问题,但是,如果你把它放在变量之前,那么"最终"会做什么,例如下面...
final EditText myTextField = (EditText) findViewById(R.id.myTextField);
Run Code Online (Sandbox Code Playgroud)
怎么final
办?
And*_*wan 70
简答
停止将"myTextField"变量分配给其他内容.
答案很长
由于上面给出的原因,我总是将"final"修饰符应用于静态字段,实例字段,局部变量和方法参数.它确实使代码膨胀一点,但对我来说,值得额外的可读性和稳健性.
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线程从另一个线程看到内存更新.如果应用程序不遵循规则,则某个线程可能会看到由某个其他线程写入的某些字段的陈旧(过时)值,从而导致偶尔出现未定义的行为.
归档时间: |
|
查看次数: |
32245 次 |
最近记录: |