0

如果我们有一个私有 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 的参数声明 final。优势。防止重复的最终修饰符缺点:不提供明确的图片,例如:如果 GraphAlgo 是 10000 行代码,那么只需查看函数“runAlgoUsingSource”,他将无法通过视觉访问了解“源”是否为最终的。

在这种情况下,一般约定是什么?

4

4 回答 4

4

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

private runAlgoUsingSource(final source) {

source现在是另一个变量,作用域为局部变量,并与您的实例变量命名相同。(它还需要一个类型。)这个本地sourceisfinal不取决于this.source(实例变量)是否是final

于 2013-08-13T23:01:06.257 回答
3

不,请随意使用 final

一个是实例变量:

private final SomeType source;

另一个是一个方法:

private runAlgoUsingSource(final SomeType source) {

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

于 2013-08-13T23:06:37.853 回答
0

这两个final修饰符不相关。一个是让实例成员生活在堆上 final。另一个正在制作方法的局部变量(恰好共享相同的名称)并且在stack final上。

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

于 2013-08-13T23:07:07.013 回答
0

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

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

于 2013-08-13T23:02:12.747 回答