将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编码最佳实践之一。