将java方法参数作为final

Joh*_*ohn 81 java methods arguments final

最终在下面的代码之间有什么不同.将参数声明为final是否有任何优势.

public String changeTimezone( Timestamp stamp, Timezone fTz, Timezone toTz){  
    return ....
}

public String changeTimezone(final Timestamp stamp, final Timezone fTz, 
        final Timezone toTz){
    return ....
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*Mmm 115

由于正式方法参数是局部变量,因此只有将它们声明为final时,才能从内部匿名类访问它们.

这样可以避免在方法体中声明另一个局部最终变量:

 void m(final int param) {
        new Thread(new Runnable() {
            public void run() {
                System.err.println(param);
            }
        }).start();
    }
Run Code Online (Sandbox Code Playgroud)

  • +1:这是一个重要的用例,也是你需要*它的唯一时间.(剩下的时间只是帮助程序员方便的事情.) (24认同)
  • Java 8不再需要了. (16认同)
  • 我可以问一下这背后的原因吗? (3认同)
  • @simgineer在这里阅读:/sf/ask/1988567661/ (3认同)
  • @AmitParashar是的,但是Java 8 **每次您必须在内部类中使用变量时,都使您免于不得不使用关键字“ final”……现实是,编译器仅使_finality_隐式的,您仍然需要变量为_effectively_ final ...因此,如果以后尝试分配给它,您仍然会遇到编译时错误!** Java 8 **:_ SNEAK 100_ :) (3认同)

pgr*_*ras 37

最终关键字的最后一个词中提取

最终参数

以下示例声明了最终参数:

public void doSomething(final int i, final int j)
{
  // cannot change the value of i or j here...
  // any change would be visible only inside the method...
}
Run Code Online (Sandbox Code Playgroud)

这里使用final来确保方法不会意外地重置两个索引i和j.它是一种方便的方法来防止错误地改变参数值的阴险错误.一般来说,简短方法是防止这类错误的更好方法,但最终参数可以成为编码风格的有用补充.

请注意,最终参数不被视为方法签名的一部分,并且在解析方法调用时被编译器忽略.参数可以声明为final(或不声明),不会影响方法的覆盖方式.

  • 在这个例子中,最好使用对象而不是基元,因为原始更改始终只在方法中可见.对于对象,您仍然可以更改它们.你只是不能指向一个新的对象.事实上现在我考虑一下,最终并没有真​​正改变任何东西,除了保留一个变量声明与AIC,并让编译器指出意外修改参数,你不想因为某些原因修改. (12认同)

djn*_*jna 23

最终会阻止您为变量分配新值,这有助于捕获拼写错误.从风格上讲,您可能希望保持接收的参数不变并仅分配给局部变量,因此最终将有助于强制执行该样式.

必须承认我很少记得使用final作为参数,也许我应该.

public int example(final int basicRate){
    int discountRate;

    discountRate = basicRate - 10;
    // ... lots of code here 
    if ( isGoldCustomer ) {
        basicRate--;  // typo, we intended to say discountRate--, final catches this
    }
    // ... more code here

    return discountRate;
}
Run Code Online (Sandbox Code Playgroud)


Adr*_*onk 14

它并没有太大的区别.这只是意味着你不能写:

stamp = null;
fTz = new ...;
Run Code Online (Sandbox Code Playgroud)

但你仍然可以写:

stamp.setXXX(...);
fTz.setXXX(...);
Run Code Online (Sandbox Code Playgroud)

这主要是对维护程序员的一个暗示,即你不会在方法中间的某个地方为参数分配一个新值,因为它不明显,可能会引起混淆.