Java方法参数中的final关键字

3

我需要确认一下关于最终方法参数的理解是否正确。 如果我们不考虑匿名类,那么我将方法参数标记为final的唯一原因是在编译时捕获错误,而不是在运行时出现问题。 我理解得对吗? 还是我错过了一些设计模式?

3个回答

3

在方法体内部为参数赋值被认为是一种不良实践:

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

将参数声明为final可以确保如果您尝试这样做,编译时不会通过。

我不知道还有其他设计因素(即除了您提到的匿名类等)。


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

0

这是正确的,final 可以帮助在编译时检测参数赋值。然而,我认为最好配置编译器来检测这种问题。例如,Eclipse 在 Java Compiler Errors/Warnings Preferences 中有一个 Parameter Assigment 设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接