V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
QBugHunter
V2EX  ›  Android

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

  •  
  •   QBugHunter · 2020-12-22 15:54:12 +08:00 · 10006 次点击
    这是一个创建于 1436 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 17:37:24 +08:00
    我问的是为什么 3.X 版本没有提示而 4.X 有提示。

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

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

    Guava 有很多补充类。

    final 用类的属性上是防止重新(使用=)赋值,用在 类上面是为阻止继承。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4550 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 10:10 · PVG 18:10 · LAX 02:10 · JFK 05:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.