class School{
private List<String> studentNames = new ArrayList<>();
//...
};
之前 3.X 版本没什么问题,但到了 4.X 版本就提示我,该域可以设为 final,即
private final List<String> studentNames = new ArrayList<>();
w 为什么 4.X 版本就推荐我把这种类型的 List 设为 final?
1
Smash 2020-12-22 16:11:50 +08:00 1
任何不需要改变的变量都用 final,这个习惯不挺好的吗?
|
2
QBugHunter OP |
3
acr0ss 2020-12-22 16:27:03 +08:00
@QBugHunter Java 又不是 Rust 。
变量不能重新赋值,类成员方法操作没有限制。 |
4
wuliaoshixia 2020-12-22 17:20:19 +08:00 1
用 kotlin 就不会有这个疑问了,默认都用 val
|
5
yukong 2020-12-22 17:20:31 +08:00 1
@QBugHunter add remove 又不会改变你 studentNames 这个变量的引用地址 除非你 List 内部的对象数组也是 final 那才是不能 add remove
|
6
gwybiaim 2020-12-22 17:29:17 +08:00
@QBugHunter #2 final 与 add 、remove 不冲突
|
7
chendy 2020-12-22 17:46:04 +08:00
因为你代码里没有给这个字段重新赋值的地方
于是,ide 认为你的代码逻辑里,这个字段**不应该**被重新赋值,所以建议设置成 final 避免被重新赋值 |
8
kx5d62Jn1J9MjoXP 2020-12-22 17:51:53 +08:00 via Android
这种过于死板的提示可以关掉
|
9
Cbdy 2020-12-22 18:03:41 +08:00 via Android
为了提醒你换 kotlin
|
10
mind3x 2020-12-22 19:01:01 +08:00
推荐阅读:
https://www.quora.com/Why-is-immutability-so-important-in-software-development https://pasztor.at/blog/why-immutability-matters https://www.google.com/search?q=why+immutability+is+important&oq=why+immu&aqs=chrome.0.0j69i57j0l6.2167j0j4&sourceid=chrome&ie=UTF-8 Java 15 以后可以直接上 Record,15 以前可以 https://immutables.github.io/ 当然,直接 Kotlin/Scala + val + data class 也是美好的。 |
11
tiiime 2020-12-22 20:47:28 +08:00 via Android
友情提醒,data class 做 api 有大坑
|
12
binbinyouliiii 2020-12-22 22:52:21 +08:00
@mind3x #10 醒醒,这是 Android
|
15
tiiime 2020-12-23 07:56:01 +08:00 via Android 1
|
16
20015jjw 2020-12-23 08:00:58 +08:00 via iPhone
这不就应该是 final 吗
不能 add 的是 immutable |
17
john6lq 2020-12-23 12:16:20 +08:00 via iPhone
这是基础没打牢
|
18
lancelock 2020-12-23 12:17:00 +08:00 via iPhone
不需要改变就 final 呗,又没影响。像 rust 定义的变量默认就是 final 。其实这是函数式编程的思想吧,你也可以不管他
|
19
youla 2020-12-23 15:30:02 +08:00
直觉让我以为 final list 无法 add
|
20
LGA1150 2020-12-23 16:46:41 +08:00
#2
如果你会 C final: char *const; immutable: const char *; |
21
kraits 2020-12-23 17:17:40 +08:00 via Android
写了 final 后,不能再有其他的同类型变量指向它,如果这个变量包含在一个类里,new 对象时候它就不能是 null 。
可能楼主对这个 final 有误解,add remove 是这个 类的 method,写了 final 仍然可以调用 method 。这是指针问题 |