java - 最终变量作为方法参数

标签 java final

我在查看同事的一些代码时发现了以下方法:

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/

相关文章:

java - 无效的列名异常 - 带别名的 JdbcPagingItemReader 查询

java - Android MD5 实现崩溃

Java:空终结器是否也会对性能产生影响?

java - 使用 Java 反射更改私有(private)静态最终字段

java - 扫描仪对象具有类属性,而不是在代码初始化中

Java 运行时 exec() 和 mysqldump

java - 非静态的 java final 变量的命名约定

scala - 将对象声明为 "final"有什么意义?

java - 更改最终 Integer 变量的值

java - 创建标题为空的文件