为什么 Android Studio 4+会推荐 List 设为 final

2020-12-22 15:54:12 +08:00
 QBugHunter
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?

5913 次点击
所在节点    Android
22 条回复
Smash
2020-12-22 16:11:50 +08:00
任何不需要改变的变量都用 final,这个习惯不挺好的吗?
QBugHunter
2020-12-22 16:23:25 +08:00
@Smash
但实际上在类成员函数里,有大量的 add(),和 remove()之类的函数
而且在 3.x 版本是没有这个提示的
acr0ss
2020-12-22 16:27:03 +08:00
@QBugHunter Java 又不是 Rust 。
变量不能重新赋值,类成员方法操作没有限制。
wuliaoshixia
2020-12-22 17:20:19 +08:00
用 kotlin 就不会有这个疑问了,默认都用 val
yukong
2020-12-22 17:20:31 +08:00
@QBugHunter add remove 又不会改变你 studentNames 这个变量的引用地址 除非你 List 内部的对象数组也是 final 那才是不能 add remove
gwybiaim
2020-12-22 17:29:17 +08:00
@QBugHunter #2 final 与 add 、remove 不冲突
chendy
2020-12-22 17:46:04 +08:00
因为你代码里没有给这个字段重新赋值的地方
于是,ide 认为你的代码逻辑里,这个字段**不应该**被重新赋值,所以建议设置成 final 避免被重新赋值
ssynhtn
2020-12-22 17:51:53 +08:00
这种过于死板的提示可以关掉
Cbdy
2020-12-22 18:03:41 +08:00
为了提醒你换 kotlin
mind3x
2020-12-22 19:01:01 +08:00
tiiime
2020-12-22 20:47:28 +08:00
友情提醒,data class 做 api 有大坑
binbinyouliiii
2020-12-22 22:52:21 +08:00
@mind3x #10 醒醒,这是 Android
VinsonGuo
2020-12-22 23:49:50 +08:00
@tiiime 有啥大坑
a0000
2020-12-23 05:40:25 +08:00
@tiiime 同问有啥大坑,能不能讲讲碰到的问题
tiiime
2020-12-23 07:56:01 +08:00
20015jjw
2020-12-23 08:00:58 +08:00
这不就应该是 final 吗
不能 add 的是 immutable
john6lq
2020-12-23 12:16:20 +08:00
这是基础没打牢
lancelock
2020-12-23 12:17:00 +08:00
不需要改变就 final 呗,又没影响。像 rust 定义的变量默认就是 final 。其实这是函数式编程的思想吧,你也可以不管他
youla
2020-12-23 15:30:02 +08:00
直觉让我以为 final list 无法 add
LGA1150
2020-12-23 16:46:41 +08:00
#2
如果你会 C
final: char *const;
immutable: const char *;

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/737904

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX