【发布时间】:2017-10-05 07:43:31
【问题描述】:
所以我完全可以理解你为什么要让你的班级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();
}
但是我为什么要这样做呢?我总是可以创建一个新变量,并且它不会将新 Object 分配给 caller 的变量吗? (我的意思是,无论如何我都无法更改调用者引用所指的内容,即使该参数未声明为 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..
}
}
但也许一旦我理解了我的主要问题,它就会变得有意义。
【问题讨论】:
-
所有急于回应或标记为 dup 的人 - 你们的扳机很轻... OP 对参数旁边的 final 关键字的语义表现出完美的理解,他问道出于动机,因为这似乎是对 Java 的多余补充!
-
而且我相信唯一可能的答案是强制执行“良好做法”(而不是重新分配论点)。除此之外,我认为将论点定为最终论点没有任何附加价值。
-
@alfasin 您可以阅读骗局,而不是编写这些 cmets。链接的问题还表明您已经写过(例如Why should I use the keyword "final" on a method parameter in Java?)。
-
一个有趣的(相关的)讨论可以在这里找到:wiki.c2.com/?JavaFinalArguments