java - 将方法参数声明为 final 的目的是什么?

标签 java variables final

<分区>

所以我可以完全理解为什么你可能想要让你的类final。想象一下 String 类不是最终的,并且您有一个库,其中有一个方法将 String 作为参数并依赖于 length()。某些操作的方法,但有人扩展了 String 类并覆盖了长度以始终返回 -1..

但我不明白为什么有人会声明方法的参数为 final。 Java 无论如何都是按值传递的,所以如果参数是原始参数,它已经是最终的(某种意义上)。如果你传递的是引用类型,它是否向方法的调用者保证任何事情?我不这么认为..

void foo(final List<Object> o) {
    o.add(new Object());
} // oops?

所以 final 防止了以下情况:

void foo(final List<Object> o) {
    o = new ArrayList();
}

但我为什么要这样做呢?我总是可以创建一个新变量,并且它不会将新对象分配给调用者的变量吗? (我的意思是,无论如何我都无法更改调用者引用所指的内容,即使参数未声明为 final..)

我的问题是,方法声明中最终参数的用途是什么?是给来电者的吗?它能保证什么吗?

我还发现奇怪的是下面的代码可以正常编译:

public interface MyInterface {
    void foo(final Object o);
}

class MyImpl implements MyInterface {
    @Override
    public void foo(Object o) { // final in interface, not final in impl..
    }
}

但一旦我理解了我的主要问题,它也许就有意义了。

最佳答案

有时,这有助于其他程序员或维护人员不应该更改该变量的值。

例如:想象一个方法接受一个字符串参数。想象一下,这是一个具有 1000 行代码的非常长的方法。如果参数未标记为最终参数,则第二个程序员会看到更改其中值的机会。第一个程序员在不知道变量被分配了新值的情况下恢复了方法的工作。 使其成为最终版本将充分确保第一个程序员的意图被传递给第二个。

除此之外,如果您需要在该方法的任何匿名类中使用此变量,除非它是最终的,否则您不能使用它。

希望这对您有所帮助。

关于java - 将方法参数声明为 final 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43828432/

相关文章:

java - 如何从代码中运行整个 JUnit 测试套件

java - 我如何包装 Guice 生成的实例,而不是自己创建它们,而是让 Guice 根据需要注入(inject)依赖项?

java - Java 中静态变量的问题

java - happens-before规则与初始化安全规则的关系

java - Android:如何在自定义 AlertDialog 中检索 Edittext.getText()?

java - 无法加载jar中的资源

php - 我可以提取函数返回值吗?

c# - 从 C# 中的变量执行函数

java - 为最终变量赋值

Java使用非final变量设置final变量