什么情况下, Java 的形参推荐使用 final 修饰

2020-08-17 10:50:34 +08:00
 brucefu

好多情况下都可以使用 final 修饰 但是修饰多了,好啰嗦,不美观 什么情况下使用 final 修饰形参既实用又美观

3994 次点击
所在节点    Java
21 条回复
securityCoding
2020-08-17 10:51:06 +08:00
不可变
Jooooooooo
2020-08-17 10:54:01 +08:00
遵守其语义就行

用 final 表达这个东西引用不可变 (但很多时候想表达其中内容也不可变, final 很不幸做不到这一点, 不过这是另外一回事
qwerthhusn
2020-08-17 10:55:10 +08:00
对于代码块中的变量,可以直接弃用 final 了
qwerthhusn
2020-08-17 10:56:44 +08:00
java 8 之后,即使不用 final,也可以将变量传入到匿名内部类或者 lambda 里面去(编译器会自动检测这个变量有没有改动赋值,如果没有,就默认是 final 的了)
sagaxu
2020-08-17 11:13:34 +08:00
多线程并发的时候就有区别了,final 修饰影响并发时的语义
Goooler
2020-08-17 11:28:39 +08:00
直接用 kotlin 就好了,不用写
OysterQAQ
2020-08-17 11:46:20 +08:00
在这个变量不变化 却又参与循环的时候 最好用 final 修饰 表明市常量 性能会有较大提升
talen666
2020-08-17 11:53:41 +08:00
建议严谨点,就像 public private 很多时候用哪个也不影响运行。
340244120w
2020-08-17 12:00:15 +08:00
对不变的数字和字符串加上,可以在编译时完成常量替换,省去运行时的计算或字符串拼接
ZeawinL
2020-08-17 12:39:48 +08:00
自定义 HashMap 等容器的 key 时
aguesuka
2020-08-17 12:43:51 +08:00
java8 以后,除了自注释,任何情况都不要写。只要变量没有变化过就是 final 的。
MakHoCheung
2020-08-17 12:55:07 +08:00
@aguesuka 这是真的吗,是在编译过程优化的?我一直以为是在 lamda 里面才自动变 final
zlllllei
2020-08-17 13:30:41 +08:00
@qwerthhusn 不知道是不是 eclipse 的坑,在方法内对一个变量重新赋值后,再在 lambda 中使用会提示非 final 的错误,你把对这个变量的赋值语句放到一个方法内就没问题,例如 i = 1; i=2; item -> item.id != i; 这里 i 就会报错。 你改成 i = getI(); 就没问题了。
kappa
2020-08-17 13:38:37 +08:00
@MakHoCheung google "effectively final"
rockyou12
2020-08-17 13:39:59 +08:00
所以像 kotlin 和其它语言中的 var 和 val 就很方便能区别可不可变
MakHoCheung
2020-08-17 14:18:16 +08:00
@kappa 搜索了说变量初始化后没有改变,默认就是 final,但是发现有个地方有疑问
```
final String a = "hello";
String b = a + " world";
//编译后字节码里面会有常量替换,生成“hello world"
```

```
String a = "hello";
String b = a + "world";
//按道理 a 就是 effectively final 的,但是编译后看字节码,需要在运行时上进行字符串拼接
```
haosamax
2020-08-17 15:44:41 +08:00
同感,private 、final 感觉可用可不用,可惜!
Cstone
2020-08-17 17:11:30 +08:00
Cstone
2020-08-17 17:11:59 +08:00
之前做的一个简单的 final 用法小归纳
aguesuka
2020-08-17 19:12:33 +08:00
@MakHoCheung https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.12.4
我测试过了,没有显示声明 final 使用默认参数确实不会优化,但是我觉得编译优化是编译器的工作,不应该由程序员来完成

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/698864

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX