Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 过度使用最终会伤害更多吗?_Java_Variables_Final - Fatal编程技术网

Java 过度使用最终会伤害更多吗?

Java 过度使用最终会伤害更多吗?,java,variables,final,Java,Variables,Final,为什么人们如此强调要使类中的每个变量都是“最终的”?我不认为将final添加到私有局部变量中有任何真正的好处,或者真正地将final用于常量以外的任何东西,并将变量传递到匿名内部类中 我不想发动任何形式的火焰战争,我只是想知道为什么这对一些人如此重要。我遗漏了什么吗?它标志着我不希望该值改变,这是免费的文档。这种做法是因为它清楚地传达了该变量的意图,并强制编译器进行验证。除此之外,它还允许编译器进行优化 意图。其他人修改您的代码不会更改他们不应该更改的值 如果编译器知道字段的值永远不会更改,则可

为什么人们如此强调要使类中的每个变量都是“最终的”?我不认为将final添加到私有局部变量中有任何真正的好处,或者真正地将final用于常量以外的任何东西,并将变量传递到匿名内部类中


我不想发动任何形式的火焰战争,我只是想知道为什么这对一些人如此重要。我遗漏了什么吗?

它标志着我不希望该值改变,这是免费的文档。这种做法是因为它清楚地传达了该变量的意图,并强制编译器进行验证。除此之外,它还允许编译器进行优化

  • 意图。其他人修改您的代码不会更改他们不应该更改的值

  • 如果编译器知道字段的值永远不会更改,则可以进行编译器优化


  • 另外,如果类中的每个变量都是final(正如您在文章中提到的),那么您就有了一个不可变的类(只要您不公开对可变属性的引用)这是实现线程安全性的一个很好的方法。

    我认为使用类内部的final over值是一种过度杀伤力,除非该类可能会被继承。唯一的优势是编译器优化,这肯定会带来好处。

    这一点很重要,因为不变性非常重要,尤其是在处理共享内存模型时。如果某个东西是不可变的,那么它是线程安全的,这使得它成为一个值得遵循的最佳实践


    我目前正在处理的一个项目的设置方式是,每当在Eclipse中按下“保存”按钮时,
    最终的
    修饰符就会添加到代码中未更改的每个变量或字段中。它还没有伤害到任何人。

    并发编程的一个好处还没有提到:


    Final字段保证在构造函数执行完成时初始化。

    如其他地方所述,使用Final有很多很好的理由。IMO是一个不值得这么做的地方,它依赖于方法的参数。严格地说,关键字在这里增加了值,但值不够高,无法承受难看的语法。我更喜欢通过单元测试来表达这种信息。

    缺点是

    annoy it is hard
    annoy to read
    annoy code or anything
    annoy else when it all 
    annoy starts in the 
    annoy same way
    
    除了创建常量和防止子类化/重写的明显用法之外,在大多数情况下,这是个人的偏好,因为许多人认为“显示程序员意图”的好处被实际的代码可读性所压倒。许多人喜欢少一点罗嗦

    至于优化,这不是使用它的好理由()。这是最糟糕的微观优化形式,在JIT时代毫无意义


    如果你喜欢,我建议你用它,如果你喜欢,就不要用它。因为在很多情况下都会归结为宗教争论,所以不要担心。

    您的意思是不希望变量的引用发生变化吗?这些是私有类还是局部变量?任何—当有人阅读代码时,他们可以看到我在该行上分配的值(或引用)就是我在该行上分配的值(或引用),在作用域的持续时间内。至于使类成员字段成为final,它强制在每个构造函数中设置这些变量,这是防止逻辑错误的好方法。是的,我擅长使用final使类不可变。实际上,这是一个不错的特性。我遇到的困难是当有人在方法中使用最终变量时。私有的BigDecimal myMethod(final BigDecimal money){final MyCalc calc=new MyCalc();return calc.doubleMyMoney(money);}我认为没有必要将MyCalc设为final。这真的有助于垃圾收集吗?它使代码的性能更高吗?@Tim:它指示编译器检测并防止对变量的意外赋值(这很可能导致逻辑错误)。这不仅仅是关于运行时性能的问题。@Tim:它还将变量标识为常量,这使我们凡人更容易摸索代码——少了一件需要跟踪的事情。当你说“过度杀戮”时,你是什么意思?也就是说,什么太多了?人们提到编译器优化,但我听说随着编译器的最新发展,final关键字对优化器没有帮助。我还没有找到关于这个的官方文档,所以我不确定人们是从哪里得到这个谣言的。每个类变量(构成一个不可变的类)和方法中的每个局部变量。一个类中的许多代码行都以“final”开头。我觉得这很难理解,而且我也在为它的好处而挣扎。@Tim:你必须在所有地方都键入final并不好(不是因为你被迫键入,而是因为大多数人都不会拼写出来,即使变量应该是final)。“Final”可能是某些情况下的默认值(例如形式化方法参数)。但现在已经太晚了。我说的过度杀戮是指没有必要写。。。它们不会增加任何价值。再次强调,使一个类为final和所有变量为final并不能创建一个完美的不可变类,但是,是的,是这样做的必要步骤。“自由地使用final”-你得到的答案指出了好处,我想问一下,你认为它可能会带来什么伤害?什么是“私有局部变量”?您是指私有字段还是局部变量?人们可能对这两种情况有不同的看法,而你的问题使你不清楚你在谈论的是哪一种情况,或者你是否同时指这两种情况。@因此,当所有内容都以同一个词开头时,阅读起来会更困难我想我指的是局部变量。。。这是私人的,因为它是本地的。:)我必须说,我不相信自由地使用final来表达意图比不使用final来表达意图要好