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