在Java中,你可以有资格局部变量和方法参数与最终的关键字。
public static void foo(final int x) {
final String qwerty = "bar";
}
这样做会导致不能够重新分配x和QWERTY键盘的方法的主体。
这种做法在轻推这被普遍认为是加不变性的方向你的代码。 但是,它也往往扰乱了“最终”处处流露出了代码。 什么是你的局部变量和方法参数Java中的final关键字的看法?
在Java中,你可以有资格局部变量和方法参数与最终的关键字。
public static void foo(final int x) {
final String qwerty = "bar";
}
这样做会导致不能够重新分配x和QWERTY键盘的方法的主体。
这种做法在轻推这被普遍认为是加不变性的方向你的代码。 但是,它也往往扰乱了“最终”处处流露出了代码。 什么是你的局部变量和方法参数Java中的final关键字的看法?
你应该尽量做到这一点,只要是合适的。 除了服务提醒你,当你“不小心”试图修改的值,它提供的信息的编译器,可导致类文件的更好的优化。 这是在书中,“铁杆的Java”由罗伯特·西蒙斯,小实际上点之一,这本书花费所有的第二章中对使用的最终促进优化和防止逻辑错误。 静态分析工具如PMD和Eclipse标志的内置SA这些各种各样为此例。
我个人的看法是,这是在浪费时间。 我相信,视觉上的混乱,并添加冗长是不值得的。
我从来没有在我已重新分配的情况下(请记住,这不会使对象不可变的,它的意思是,你不能重新分配另一个引用变量)错误的变量。
但是,当然,这一切都看个人喜好;-)
制造参数最终保证了在该方法的任何位置中使用的值是指传递的值。 否则,你必须在精神上解析给定位置的所有上面的代码知道参数有在这一点上有什么价值。
因此, 不使用最终使你的代码的可读性和可维护,全部由自己:)
最后的局部变量取决于意图,是在我的观点不那么重要了。 要看是什么不胜枚举。
在局部变量的情况下,我倾向于避免这种情况。 它会导致视觉混乱,通常是不必要的 - 一个功能应足够短或者专注于单一的影响,让你快看,你是修改一些不应该。
在幻数的情况下,我会把它们作为一个恒定的私有字段无论如何,而不是在代码中。
如果有必要,我只在情况下使用最后的(例如,将值传递给匿名类)。
由于Java的的(偶尔)迷惑性“ 按引用传递 ”的行为我绝对敲定参数变种的同意。
最后确定局部变量的似乎有点矫枉过正海事组织。
做吧。
这是关于可读性。 这是容易当你知道变量分配一次且仅一次来思考程序的可能的状态。
体面的替代方法是打开时的参数被分配了IDE警告时,或者当变量(比循环变量其它)被分配一次以上。
最终有三个很好的理由:
类似的方法,局部变量和参数不需要被声明为final。 至于有人说之前,这杂波的代码变得与编译器优化服务表现很少efford的可读性,这是大多数代码片段没有真正的理由。
虽然它创建了一个有点混乱,这是值得投入final
。 Ides的如Eclipse可以自动把final
,如果你配置它这样做。
使局部变量和方法参数, final
像你实例化一个匿名的主题和要访问的run()方法的主体那些PARAMS -如果你希望将这些参数传递到匿名类是必不可少的。
除此之外,我不知道的性能优势WRT通过编译优化更好的性能。 它是由具体的编译器实现,究竟是在所有优化呢?
这将是很好的了解,从使用的效果统计final
...
你为什么要? 你写的方法,所以任何人修改它总是可以从QWERTY去掉final关键字并重新分配它。 至于方法签名,同样的道理,虽然我不知道它会做你的类的子类......他们可以继承的最后一个参数即使它们覆盖的方法,是无法去完成X。 试试吧,看看它是否会工作。
唯一真正的好处,那么,如果你把参数不变,并延续到孩子。 否则,你只是塞满您的代码没有什么特别好的理由。 如果它不会强迫任何人按照你的规则,你就要去只是留下一个好的意见,你为什么你不应该改变,而不是如果final修饰符给予该参数或变量更好。
编辑
在回应评论,我会补充一点,如果你看到的性能问题,让你的局部变量和参数可以最终让编译器来优化你的代码更好。 然而,从你的代码的不变性的角度来看,我坚持我原来的发言。
我让Eclipse中做到这一点对我来说,当他们在一个匿名类,它正在不断增加使用,由于我使用谷歌收集的API。
我们在这里为局部变量做,如果我们认为他们不会被重新分配或不应该被重新分配。
该参数不是最终的,因为我们有一个Checkstyle的检查,其检查的重新分配参数。 当然,没有人会要重新分配参数变量。