最终变量作为方法参数

时间:2011-07-30 07:41:04

标签: java final

我正在查看同事的一些代码并看到以下方法:

public void someMethod(final String str) {
    ...
}

我发现奇怪,因为字符串是不可变的,无论如何。我认为删除final关键字是安全的。

我还发现了以下内容

public void reportProblems(final Collection<IProblem> problems) {
    ...
}

周围没有任何内部类,所以..在那里使用final关键字是否有意义?在我看来,在决赛中有完全相同的没有。我是对的吗?

由于

3 个答案:

答案 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)

它会阻止您在方法体内分配参数变量。所以它确实有所作为。