我需要确认我对最终方法参数的理解是否正确。 如果我们将这个讨论中的匿名类放在一边,那么我将一个方法参数标记为final的唯一原因是在编译时捕获一些内容,而不是稍后对运行时错误进行讨论。 我弄错了吗? 或者是否有一些我错过的设计范例?
答案 0 :(得分:3)
从方法体内为参数赋值是一种不好的做法:
public void myMethod (String parm) {
parm = "some-value"; // This is very frowned upon
}
将参数声明为final
可确保您在尝试此类练习时不会通过编译。
我没有其他设计因素(也就是说,除了你提到的关于匿名类等的内容之外)。
答案 1 :(得分:2)
它在运行时没有任何区别。这可以用最具决定性的方式证明:添加final
修饰符甚至不会更改已编译的字节码!
class FinalParam {
public static void main(String[] args) {
System.out.println(java.util.Arrays.toString(args));
}
}
$ javac -version
javac 1.7.0_15
$ javac FinalParam.java
$ md5sum FinalParam.class
7ca43ea68179f6191d5bf1de7ba21945
$ rm FinalParam.class
FinalParam.java(之后)
class FinalParam {
public static void main(final String[] args) {
System.out.println(java.util.Arrays.toString(args));
}
}
$ javac FinalParam.java
$ md5sum FinalParam.class
7ca43ea68179f6191d5bf1de7ba21945
答案 2 :(得分:0)
这是正确的,final有助于在编译时检测参数分配。但是我认为配置编译器来检测这类问题会更好。例如Eclipse在Parameter Assigment
中设置了Java Compiler Errors/Warnings Preferences
。