原文翻译自http://www.omsn.de/blog/java-devs-why-you-should-use-the-final-modifier-more-often
?
原文很简单,我在这里只大概总结下它的观点和我自己的一些想法。
?
首先,原文认为应该给类中未在声明中初始化的域加上final关键字,这样可以避免运行时出现NullPointerException. 这是因为对于未在声明中初始化的域,如果将其加上final关键字,编译器会强制要求在构造函数中初始化,这样不会引起运行时出现NullPointerException。对于这一点,我个人不是非常赞同。通常在工程中未在声明时初始化很有可能是出于lazy initialization的需要,即由于初始化变量所需要的资源开销比较大,所以只在需要的时候才初始化变量,这种时候加上final关键字会适得其反。
?
第二,原文认为在一些不会被子类override的函数上加上final关键字会增加性能,原因有二:fianl函数省去了jvm调用的时候检查的时间,即java虚拟机在调用函数的时候不必再去检查子类的实现;final函数可以被inline化。对于这一点,我个人非常赞同,因为首先,final关键字不会引起重构上的麻烦,如果某个final函数需要被子类override了,只需要去掉final关键字就行;其次,java的编码规范建议使用getter和setter函数来将field暴露给掉用者,而这类函数通常不会被子类重载,而且开销很小,如果加上final关键字,相信应该能提升程序的性能。
同理,如果类被加上final关键字的话,所有的函数默认也会变成final,这对不需要被重载的类来说也是一个提升性能的方法。
?