我需要确认一下关于最终方法参数的理解是否正确。 如果我们不考虑匿名类,那么我将方法参数标记为final的唯一原因是在编译时捕获错误,而不是在运行时出现问题。 我理解得对吗? 还是我错过了一些设计模式?
在方法体内部为参数赋值被认为是一种不良实践:
public void myMethod (String parm) {
parm = "some-value"; // This is very frowned upon
}
将参数声明为final
可以确保如果您尝试这样做,编译时不会通过。
我不知道还有其他设计因素(即除了您提到的匿名类等)。
在运行时没有任何区别。这可以通过最有力的方式证明:添加 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
这是正确的,final 可以帮助在编译时检测参数赋值。然而,我认为最好配置编译器来检测这种问题。例如,Eclipse 在 Java Compiler Errors/Warnings Preferences
中有一个 Parameter Assigment
设置。