在Java中,您可以使用final关键字限定局部变量和方法参数.
public static void foo(final int x) { final String qwerty = "bar"; }
这样做会导致无法在方法体中重新分配x和qwerty.
这种做法使你的代码向不变性的方向推动,这通常被认为是一个加分.但是,它也会使代码混乱,"最终"出现在各处.您对Java中的局部变量和方法参数的final关键字有何看法?
只要合适,你应该尝试这样做.除了在"意外"尝试修改值时发出警告,它还为编译器提供了可以更好地优化类文件的信息.这是Robert Simmons,Jr.的书中的"Hardcore Java"中的一点.实际上,本书花了所有第二章关于final的使用来促进优化和防止逻辑错误.出于这个原因,诸如PMD和Eclipse的内置SA之类的静态分析工具标记了这些类型的情况.
我个人认为这是浪费时间.我相信视觉上的混乱和额外的冗长是不值得的.
我从来没有遇到过我重新分配的情况(请记住,这不会使对象成为不可变的,这意味着你无法重新分配另一个对变量的引用)一个错误的变量.
但是,当然,这都是个人偏好;-)
最后制作一个参数可以保证方法中任何位置使用的值都是指传递的值.否则,您必须在心理上解析给定位置上方的所有代码,以了解参数在该点的值.
因此,不使用final会使您的代码本身不易读取和维护:)
最终的局部变量取决于意图,在我看来并不重要.取决于发生了什么.
在局部变量的情况下,我倾向于避免这种情况.它会导致视觉混乱,并且通常是不必要的 - 一个功能应该足够短或专注于一次冲击,让你快速看到你修改了一些不应该的东西.
在魔术数字的情况下,我会将它们作为一个常量私有字段而不是代码中.
我只在有必要的情况下使用final(例如,将值传递给匿名类).
由于Java的"偶然参与" 传递行为(偶尔)令人困惑,我绝对同意最终确定参数var.
最终确定局部变量似乎有点过分了IMO.