为什么 Android Studio 4+会推荐 List 设为 final - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
QBugHunter
V2EX    Android

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

  •  
  •   QBugHunter 2020 年 12 月 22 日 13937 次点击
    这是一个创建于 1898 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 条附言    2020 年 12 月 23 日
    我问的是为什么 3.X 版本没有提示而 4.X 有提示。

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

    Java 中目前只有 List.of, Set.of, Map.of , 还有 Collections.immutableXXX 创建的 Collection 是无法变更的,有 Immutable 概念。

    Guava 有很多补充类。

    final 用类的属性上是防止重新(使用=)赋值,用在 类上面是为阻止继承。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1753 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 16:22 PVG 00:22 LAX 08:22 JFK 11:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86