将java方法参数作为final
下面的代码之间最后做了什么区别。 宣布论证是否有任何优势是最终的。
public String changeTimezone( Timestamp stamp, Timezone fTz, Timezone toTz){ return .... } public String changeTimezone(final Timestamp stamp, final Timezone fTz, final Timezone toTz){ return .... }
作为一个正式的方法参数是一个局部variables,只有当它们被声明为final时,才可以从内部匿名类访问它们。
这样可以避免在方法体中声明另一个本地最终variables:
void m(final int param) { new Thread(new Runnable() { public void run() { System.err.println(param); } }).start(); }
从final关键字的最后一个字中提取
最终参数
以下示例声明了最终参数:
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... }
最后在这里用来确保两个索引i和j不会被这个方法意外地重置。 这是防止错误地改变参数值的一个方便的方法。 一般来说,简短的方法是防止这类错误的一种更好的方法,但是最终的参数可以是对你的编码风格有用的补充。
请注意,最终参数不被视为方法签名的一部分,并在parsing方法调用时被编译器忽略。 参数可以被声明为final(或不),而不影响方法如何被覆盖。
最后的结果是阻止你为variables赋予一个新的值,这可以有助于捕获错别字。 在风格上,你可能想保持收到的参数不变,只分配给本地variables,所以最后将有助于强制执行这种风格。
必须承认,我很less记得使用最终的参数,也许我应该。
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; }
这并没有太大的区别。 这只是意味着你不能写:
stamp = null; fTz = new ...;
但你仍然可以写:
stamp.setXXX(...); fTz.setXXX(...);
这主要是对维护程序员的一个暗示,即你不打算给方法中间的某个地方分配一个新的值,这个值不明显,因此可能会引起混淆。
在Java中用于参数/variables的最后一个关键字将引用标记为final。 在将对象传递给另一个方法的情况下,系统创build引用variables的副本并将其传递给方法。 通过最后标记新的参考,您可以保护它们免于重新分配。 这有时被认为是一个很好的编码习惯。
对于这个方法的主体, final
关键字将防止参数引用被意外地重新分配给这些情况下的编译错误(大多数IDE将立即抱怨)。 有些人可能会争辩说,尽可能地使用final
来加快速度,但在最近的JVM中并不是这样。
它只是一个在Java中的构造来帮助你定义一个契约并坚持下去。 类似的讨论在这里: http : //c2.com/cgi/wiki?JavaFinalConsideredEvil
顺便说一句(正如twiki所说的),如果你遵循好的编程原则,并且已经重新分配/重新定义了传入的参数引用,那么将args标记为final是一般多余的。
在最坏的情况下,如果你重新定义了args引用,它不会影响传递给函数的实际值 – 因为只有一个引用被传递了。
我所说的标记variables和字段是final的 – 不仅适用于方法参数。 (标记方法/类最终是一个完全不同的东西)。
这对您的代码的读者/未来维护者是有利的。 再加上一个明智的variables名称,对于读者来说,看到/理解variables所代表的内容是有帮助的,让人放心的是,读者可以放心,只要你看到variables在同一个范围内,同样的,所以他不必小心翼翼地想出在各种情况下variables的含义。 我们已经看到了太多滥用variables的“重复使用”,甚至使得简短的代码片段难以理解。
最后一个关键字阻止您为参数分配新值。 我想用一个简单的例子来解释一下
假设我们有一个方法
方法1(){
datedateOfBirth =新date(“1/1/2009”);
方法2(DATEOFBIRTH);
方法3(DATEOFBIRTH); }
public mehod2(Date dateOfBirth){
….
….
….
}public mehod2(Date dateOfBirth){
….
….
….
}
在上述情况下,如果在method2中为“dateOfBirth”分配了新的值,则会导致method3输出错误。 由于正在传递给method3的值不是传递给method2之前的值。 所以要避免这个最后的关键字用于参数。
这也是Java编码最佳实践之一。