QBugHunter
V2EX  ›  Android

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

  •  
  •   QBugHunter · Dec 22, 2020 · 14308 views
    This topic created in 1972 days ago, the information mentioned may be changed or developed.
    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?

    Supplement 1  ·  Dec 23, 2020
    我问的是为什么 3.X 版本没有提示而 4.X 有提示。

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

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

    Guava 有很多补充类。

    final 用类的属性上是防止重新(使用=)赋值,用在 类上面是为阻止继承。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5898 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 69ms · UTC 07:09 · PVG 15:09 · LAX 00:09 · JFK 03:09
    ♥ Do have faith in what you're doing.