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

请教关于 final 的疑问

  •  
  •   reid2017 · 35 天前 · 1173 次点击
    这是一个创建于 35 天前的主题,其中的信息可能已经有所发展或是发生改变。

    经常阅览一些大神写的开源项目,看到很多在定义引用类型 /对象变量时,都会加上 final 关键字约束,很多方法的形参如果是引用类型也会加上 final,查阅资料是不让改变引用的指向,据说会对 jvm 性能有一定的提升。

    不知道有没有大神详细解答下,用或不用 final ,性能差别会有多大呢?或者与性能无关,而是其它的原因?

    14 回复  |  直到 2019-01-19 12:47:08 +08:00
        1
    Hyseen   35 天前   ♥ 1
    不会有性能上的提升,参考知乎上 R 大的回答。
    https://www.zhihu.com/question/66083114/answer/242241071
        2
    earendil1412   35 天前 via Android
    class 上是防止被继承
    方法上是防止被 override
    这俩的原因是因为:要设计一个好的可继承类其实是很麻烦的。具体去参考下 oo 设计的东西
    field 和内部变量上用是防止引用被修改了。一定程度上可以防止自己写 bug 以及类在别的地方被修改了。
        3
    chenyu8674   35 天前
    任何技术 /方案 /架构 /框架都离不开两个命题:提升 NBer 的体验和降低 SBer 的破坏力
    final 是后者
        4
    reid2017   35 天前
    @google614
    @earendil1412
    @chenyu8674
    所以,大佬们平常写代码,会习惯性的加 final 修饰局部变量(引用类型)吗?
        5
    earendil1412   35 天前 via Android
    @reid2017 好吧,我习惯不太好。。。
        6
    42alex   35 天前   ♥ 1
    编译器会把 final 改为内嵌调用,性能还会降低一些,加 final 主要是为了防止被覆盖
        7
    passerbytiny   35 天前
    final 别乱搞用,都加 final,那是搬石头砸自己。给变量或形参加上 final,基本表示接下来准备弄它了,加上 final 限制,能避免一不小心让它被替身代替了。如果有良好的代码规范和代码评审,那么加不加 final 都无所谓,因为一个方法就几十行,误重新赋值的可能性太低了。

    有些变量是要根据不同的条件设置不同的值的,这时候你要是上了 final,绝对编译错误。
        8
    zn   35 天前 via iPhone
    @passerbytiny final 局部变量只可以赋值一次吗,不同条件下赋值一次就好了,依然可以用 final
        9
    earendil1412   35 天前 via Android
    @42alex java 8 会自动给能加 final 的内部变量加上 final。
        10
    reid2017   35 天前
    @earendil1412 还有这种操作?
        11
    earendil1412   35 天前 via Android
    @reid2017 为了兼容λ。λ里的变量只允许 final 的。
        12
    DovaKeen   35 天前
    我听过一句话叫一个类要不就是面向继承的,要不就是 final 修饰的。结合开闭原则来看,如果有不想被子类修改的方法,用 final 修饰一下还是挺好的。
        13
    honeycomb   35 天前 via Android
    @reid2017 写 final 不是为了性能,而是为了功能。
    很早期的 JVM 或许会有性能上的差异,现在都 9102 年了。
        14
    liangdu   34 天前 via Android
    在编译后会加入内存屏障,保证多线程的可见性(你猜对了,他这个功能和 volatile 一样。所以 JVM 规范声明了两者只能选其一),以及导致初始化过程中被多线程访问时出现逃逸(没初始化就被访问了,遵循 happenbefores 原则)。和 final static 一起使用可以让初始化在编译期可以变成 constant value。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2158 人在线   最高记录 4385   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 18ms · UTC 04:20 · PVG 12:20 · LAX 20:20 · JFK 23:20
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1