好多情况下都可以使用 final 修饰 但是修饰多了,好啰嗦,不美观 什么情况下使用 final 修饰形参既实用又美观
好多情况下都可以使用 final 修饰 但是修饰多了,好啰嗦,不美观 什么情况下使用 final 修饰形参既实用又美观
1
securityCoding Aug 17, 2020
不可变
|
2
Jooooooooo Aug 17, 2020
遵守其语义就行
用 final 表达这个东西引用不可变 (但很多时候想表达其中内容也不可变, final 很不幸做不到这一点, 不过这是另外一回事 |
3
qwerthhusn Aug 17, 2020
对于代码块中的变量,可以直接弃用 final 了
|
4
qwerthhusn Aug 17, 2020
java 8 之后,即使不用 final,也可以将变量传入到匿名内部类或者 lambda 里面去(编译器会自动检测这个变量有没有改动赋值,如果没有,就默认是 final 的了)
|
5
sagaxu Aug 17, 2020 via Android
多线程并发的时候就有区别了,final 修饰影响并发时的语义
|
6
Goooler Aug 17, 2020
直接用 kotlin 就好了,不用写
|
7
OysterQAQ Aug 17, 2020
在这个变量不变化 却又参与循环的时候 最好用 final 修饰 表明市常量 性能会有较大提升
|
8
talen666 Aug 17, 2020
建议严谨点,就像 public private 很多时候用哪个也不影响运行。
|
9
340244120w Aug 17, 2020 via iPhone
对不变的数字和字符串加上,可以在编译时完成常量替换,省去运行时的计算或字符串拼接
|
10
tty0 Aug 17, 2020 via iPhone
自定义 HashMap 等容器的 key 时
|
11
aguesuka Aug 17, 2020 via Android
java8 以后,除了自注释,任何情况都不要写。只要变量没有变化过就是 final 的。
|
12
MakHoCheung Aug 17, 2020 via iPhone
@aguesuka 这是真的吗,是在编译过程优化的?我一直以为是在 lamda 里面才自动变 final
|
13
zlllllei Aug 17, 2020
@qwerthhusn 不知道是不是 eclipse 的坑,在方法内对一个变量重新赋值后,再在 lambda 中使用会提示非 final 的错误,你把对这个变量的赋值语句放到一个方法内就没问题,例如 i = 1; i=2; item -> item.id != i; 这里 i 就会报错。 你改成 i = getI(); 就没问题了。
|
14
kappa Aug 17, 2020
@MakHoCheung google "effectively final"
|
15
rockyou12 Aug 17, 2020
所以像 kotlin 和其它语言中的 var 和 val 就很方便能区别可不可变
|
16
MakHoCheung Aug 17, 2020
@kappa 搜索了说变量初始化后没有改变,默认就是 final,但是发现有个地方有疑问
``` final String a = "hello"; String b = a + " world"; //编译后字节码里面会有常量替换,生成“hello world" ``` ``` String a = "hello"; String b = a + "world"; //按道理 a 就是 effectively final 的,但是编译后看字节码,需要在运行时上进行字符串拼接 ``` |
17
haosamax Aug 17, 2020
同感,private 、final 感觉可用可不用,可惜!
|
18
Cstone Aug 17, 2020
|
19
Cstone Aug 17, 2020
之前做的一个简单的 final 用法小归纳
|
20
aguesuka Aug 17, 2020
@MakHoCheung https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.12.4
我测试过了,没有显示声明 final 使用默认参数确实不会优化,但是我觉得编译优化是编译器的工作,不应该由程序员来完成 |
21
draymonder Sep 1, 2020
补充一点: 不用从数据库里读出来的时候
|