最近阅读代码的时候,发现一些程序员很喜欢用final修饰局部变量,这到底是不是一个良好的习惯呢?
于是我查阅了相关资料,发现《并发编程实战》一书中的【3.4.1 Final域】提到
正如“除非需要更高的可见性,否则应将所有的域都声明为私有域”是一个良好的编程习惯,
“除非需要某个域是可变的,否则应将其声明为final域”也是一个良好的编程习惯。
查阅了相关的博文:
JAVA局部变量加final修饰的好处
JVM对于声明为final的局部变量做了哪些性能优化?
发现final的好处主要有:
- 被final修饰的基本数据类型不可变,引用数据类型地址不可被修改;
- 访问final变量的速度快;
- (待总结)
- 这是否意味着日常在写代码时,要尽量给局部变量用final修饰?
- 函数中大部分变量都是用final修饰的,是否会影响代码的阅读体验?
访问final变量的速度快
这个结论有什么依据吗?我所了解的,JVM会对
final
变量的访问会禁止重排序优化,如果不使用final
,访问变量时会进行重排序优化从而提高性能,但是在多线程情况下,重排序可能会造成线程安全问题,所以使用final
修饰共享变量会避免这种重排序。专业的话讲就是防止变量从构造方法中逸出
。另外final
修饰的类变量虽然是共享的,但不可变能保证他的线程安全。不过用
final
修饰方法和类确实能提高性能,如果没有final
修饰,那么该类可能会被继承,JVM需要为继承做一些准备,如果有final
修饰,相当于告诉JVM,该类或方法是不会被继承的,所以JVM会省掉哪些准备的时间。对于局部变量,看看R大的回答:
https://www.zhihu.com/questio...
最重要部分是,用
final
修饰局部变量,编译器会进行常量折叠。