我正在查看同事的一些代码并看到以下方法:
public void someMethod(final String str) {
...
}
我发现奇怪,因为字符串是不可变的,无论如何。我认为删除final
关键字是安全的。
我还发现了以下内容
public void reportProblems(final Collection<IProblem> problems) {
...
}
周围没有任何内部类,所以..在那里使用final
关键字是否有意义?在我看来,在决赛中有完全相同的没有。我是对的吗?
由于
答案 0 :(得分:8)
字符串的不变性完全与是否声明final
无关。你可能有一个最终的StringBuilder
参数,它会阻止完全相同的事情:在方法中重新分配变量。您仍然可以附加到StringBuilder
。 Java中的final
与C ++中的const
不同。
有些人喜欢在可能的情况下将所有内容都设为最终 - 如果您知道变量的值不会发生变化,则可以更容易地对其进行推理。我对这种观点有很多同情,并且经常采用相同的方法 - 除了我实际上并没有使用final
修饰符强制问题,只是因为它增加了代码。如果final
是默认设置而您必须明确使用mutable
修饰符,我怀疑大多数开发人员不会开始使每个本地变量都可变...他们是只需使用默认值,就像现在一样。
所以,回到最初的问题:我怀疑开发者只是想明确他们的风格。这不是我怎么做的,但我能理解动机。另一种可能性是,是一个内部类,但现在已经消失,开发人员忘记删除final
修饰符。
当然,如果你的同事写了代码,你就不用猜了 - 只要问一下!
答案 1 :(得分:2)
在我看来,决赛中的决赛与没有决赛完全相同。我是对的吗?
你错了,因为它不是绝对相同。
如下所示的代码将在没有 final ...
的情况下编译public void someMethod(String str) {
str = "nonsense"; // will compile fine
}
...如果有最终的
则不会编译public void someMethod(final String str) {
str = "nonsense"; // won't compile
}
“一个词有什么不同”
答案 2 :(得分:1)
它会阻止您在方法体内分配参数变量。所以它确实有所作为。