3

我需要确认我对最终方法参数的理解是否正确。如果我们不讨论匿名类,我将方法参数标记为 final 的唯一原因是在编译时捕获一些东西,而不是稍后为运行时错误挠头。我理解正确吗?还是我错过了一些设计范式?

4

3 回答 3

3

从方法体内为参数赋值被认为是一种不好的做法:

public void myMethod (String parm) {
    parm = "some-value";     // This is very frowned upon
}

将参数声明为final确保您在尝试这种做法时不会通过编译。

我不知道其他设计因素(也就是说,除了您提到的关于匿名类等的内容)。

于 2013-03-31T05:41:47.903 回答
2

它在运行时没有什么区别。这可以用最确凿的方式证明:添加final修饰符甚至不会改变编译后的字节码!

FinalParam.java(之前)

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
于 2013-03-31T05:57:55.577 回答
0

这是正确的,final 有助于在编译时检测参数分配。但是我认为最好配置编译器来检测这种问题。例如 EclipseParameter AssigmentJava Compiler Errors/Warnings Preferences.

于 2013-03-31T06:52:05.167 回答