java方法参数中的final

时间:2013-03-31 05:39:29

标签: java final

我需要确认我对最终方法参数的理解是否正确。 如果我们将这个讨论中的匿名类放在一边,那么我将一个方法参数标记为final的唯一原因是在编译时捕获一些内容,而不是稍后对运行时错误进行讨论。 我弄错了吗? 或者是否有一些我错过的设计范例?

3 个答案:

答案 0 :(得分:3)

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

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

将参数声明为final可确保您在尝试此类练习时不会通过编译。

我没有其他设计因素(也就是说,除了你提到的关于匿名类等的内容之外)。

答案 1 :(得分: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

答案 2 :(得分:0)

这是正确的,final有助于在编译时检测参数分配。但是我认为配置编译器来检测这类问题会更​​好。例如Eclipse在Parameter Assigment中设置了Java Compiler Errors/Warnings Preferences