我在查看同事的一些代码时发现了以下方法:
public void someMethod(final String str) {
...
}
我发现这很奇怪,因为无论如何字符串都是不可变的。我认为删除 final
关键字是安全的。
我还发现了以下内容
public void reportProblems(final Collection<IProblem> problems) {
...
}
周围没有任何内部类,所以..在那里使用final
关键字有什么意义吗?在我看来,在那里举行 final 与不举行 final 完全一样。我说得对吗?
谢谢
最佳答案
字符串的不变性完全与它是否声明为final
无关。您可以有一个最终的 StringBuilder 参数,它会阻止完全相同的事情:在方法内重新分配变量。您仍然可以附加到 StringBuilder
。 Java 中的 final
与 C++ 中的 const
不同。
有些人喜欢尽可能将所有内容都确定为最终结果 - 如果您知道变量的值不会改变,则可以更容易地推理它。我非常赞同这种观点,并且我自己也经常采取同样的方法 - 只是我实际上并没有强制使用 final
修饰符来解决这个问题,仅仅是因为它增加了代码的缺陷。如果 final
是默认值,并且您必须显式使用 mutable
修饰符,我怀疑大多数开发人员不会开始使每个局部变量都可变...他们大多数时候只是使用默认值,就像现在一样。
所以,回到最初的问题:我怀疑开发人员只是想明确他们的风格。这不是我的做法,但我可以理解其动机。另一种可能性是,曾经有一个内部类,但现在它已经消失了,开发人员忘记删除 final
修饰符。
当然,如果您的同事编写了代码,您不必猜测 - 只需询问即可!
关于java - 最终变量作为方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6881837/