如果避免,最后的声明是否重复?

时间:2013-08-13 22:56:38

标签: java final

如果我们将一个私有的最终实例变量传递给私有方法,那么当作为参数传递时,我们是否在函数中使用final修饰符重新声明它?例如:

public class GraphAlgo {

  private final source;

  public GraphAlgo(source) {
     this.source = source
  }

  public void runAlgo() {
     runAlgoUsingSource(source);
  } 

  private runAlgoUsingSource(final source) {  // here final is declared on a final field
    //-- whatever.
  } 
}

不要为已经是最终的参数声明final。 优点。防止重复的最终修饰符 缺点:不提供明确的图片,例如:如果GraphAlgo是一个10000行代码,那么只需查看函数'runAlgoUsingSource',他就没有视觉访问权来理解'source'是否是最终的。

这种情况下的一般惯例是什么?

4 个答案:

答案 0 :(得分:4)

这里,source已经是一个实例变量。为什么将它传递给方法?就此而言,

private runAlgoUsingSource(final source) {

source现在是另一个变量,作为局部变量确定范围,并且命名与实例变量相同。 (它还需要一个类型。)本地source final是否this.source不取决于final(实例变量)是{{1}}。

答案 1 :(得分:3)

不,Use final liberally

一个是实例变量:

private final SomeType source;

另一个是方法:

private runAlgoUsingSource(final SomeType source) {

第一个说实例变量不能改变(如果它是引用它不能引用不同的对象),第二个说不能改变方法参数。

答案 2 :(得分:0)

这不是惯例;两个final声明意味着不同的东西。即使字段的值流入参数,该字段也可以是final,参数不是final,反之亦然。

这是一个有争议的问题,但我的观点是,如果需要,你应该只声明一个参数final - 基本上你需要声明一个参数final的唯一原因是你在其中使用它的值一个匿名的内部阶级。另一方面,字段应为final,除非您明确要修改它们。

答案 3 :(得分:0)

两个final修饰符不相关。一个人让实例成员生活在 final上。另一个正在制作方法的局部变量(它碰巧共享相同的名称)并位于堆栈 final

标记方法局部变量 final可以让JVM优化某些东西(因为它现在知道方法不会修改它),这是一个很好的做法。标记实例成员 final更多的是声明实际常量。