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