如果在代码中没有修改它,我应该声明一个java字段'final'吗?

Iva*_*hov 15 java performance final

我的问题主要是关于表现.编译器更清楚地知道,例如,在对象实例化之后,某些变量未被修改.那么,为什么要打扰决赛呢?

我认为可能会有许多结构/逻辑原因,但从性能的角度来看呢?有关系吗?

谢谢,

Lau*_*ves 21

现代 JVM中,final 不应该影响性能.对于私有字段尤其如此,但即使对于非私有字段,JIT也可以优化非最终字段,因为它们是最终的,然后如果加载一些实际上修改字段的代码则进行去优化.

也就是说,使用final的主要原因不是性能,而是使代码更易于维护.通过最终制作字段,您可以减少代码中"移动部件"读取器的数量,从而更容易推理代码.

  • @Ivan:我不是说"可能有影响,但可以忽略不计".我说在现代JVM上它根本不应该对性能产生任何影响.但是,在某些*JVM上它可能会产生影响.例如,Android的某些版本的VM可能存在问题 - Dalvik通常不像Hotspot那样聪明.我同意你"不应仅仅出于性能原因使用final",但更多的是因为final有其他非常重要的用途(即:提高可读性/可维护性).即使最终/有最大的性能影响,也不是使用它的"唯一"理由. (3认同)

Fru*_*ner 8

我怀疑从性能的角度来看它是否重要,但如果您(但更可能是其他新开发人员)稍后尝试在代码中修改该字段,它仍然可能是一个好主意.final将其标记为将阻止您甚至编译它.


Chr*_*rau 8

使用final的领域也有着对中国的启示线程安全.在Java内存模型规定值final的字段变得可以尽快访问该对象为对象完成的构造函数中的所有线程可见.该保证类似于volatile字段,其中任何线程始终看到当前值.普通领域没有这样的保证.

并且,正如其他人所指出的,JIT可以对final字段执行积极的优化,这对于正常字段来说并不容易,其中任何新加载的类都可以对字段进行写访问.


Oli*_*rth 5

final在编译时用于接受或拒绝您的源代码有效.它不应该有任何运行时的影响.


Hen*_*olm 5

如果该字段是任何东西private,则JVM将始终必须准备好在某个时间加载尚未遇到的类并开始修改它.因此,对于那些字段,明确声明它们final可能允许在JIT中进行更强的优化.如果JIT一次只查看一个方法,私有字段甚至可能是这样.

另一方面,final局部变量不能在字节码编译中存活,因此应该没有性能影响.