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)
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(或不声明),不会影响方法的覆盖方式.
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)
这主要是对维护程序员的一个暗示,即你不会在方法中间的某个地方为参数分配一个新值,因为它不明显,可能会引起混淆.