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?
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
任何不需要改变的变量都用 final,这个习惯不挺好的吗?
|
|
2
|
|
acr0ssDec 22, 2020
3
@QBugHunter Java 又不是 Rust 。
变量不能重新赋值,类成员方法操作没有限制。 |
|
4
用 kotlin 就不会有这个疑问了,默认都用 val
|
|
5
@QBugHunter add remove 又不会改变你 studentNames 这个变量的引用地址 除非你 List 内部的对象数组也是 final 那才是不能 add remove
|
|
gwybiaimDec 22, 2020
6
@QBugHunter #2 final 与 add 、remove 不冲突
|
|
chendyDec 22, 2020
7
因为你代码里没有给这个字段重新赋值的地方
于是,ide 认为你的代码逻辑里,这个字段**不应该**被重新赋值,所以建议设置成 final 避免被重新赋值 |
|
kx5d62Jn1J9MjoXPDec 22, 2020 via Android
8
这种过于死板的提示可以关掉
|
|
CbdyDec 22, 2020 via Android
9
为了提醒你换 kotlin
|
|
mind3xDec 22, 2020
10
推荐阅读:
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 也是美好的。 |
|
tiiimeDec 22, 2020 via Android
11
友情提醒,data class 做 api 有大坑
|
|
binbinyouliiiiDec 22, 2020
12
@mind3x #10 醒醒,这是 Android
|
|
15
|
|
20015jjwDec 23, 2020 via iPhone
16
这不就应该是 final 吗
不能 add 的是 immutable |
|
jon97Dec 23, 2020 via iPhone
17
这是基础没打牢
|
|
lancelockDec 23, 2020 via iPhone
18
不需要改变就 final 呗,又没影响。像 rust 定义的变量默认就是 final 。其实这是函数式编程的思想吧,你也可以不管他
|
|
youlaDec 23, 2020
19
直觉让我以为 final list 无法 add
|
|
LGA1150Dec 23, 2020
20
#2
如果你会 C final: char *const; immutable: const char *; |
|
kraitsDec 23, 2020 via Android
21
写了 final 后,不能再有其他的同类型变量指向它,如果这个变量包含在一个类里,new 对象时候它就不能是 null 。
可能楼主对这个 final 有误解,add remove 是这个 类的 method,写了 final 仍然可以调用 method 。这是指针问题 |