Java及Final关键字的使用

4

我之前使用过Delphi和C#,现在刚开始学习Java。我的问题与在同一个方法的作用域内声明和实例化一个变量来保存已实例化类时,是否需要使用"final"关键字有关。例如:

private String getDeviceID() {
   //get the android device id
   final TelephonyManager tm =                
     (TelephonyManager)GetBaseContext().getSystemService(Context.TELEPHONY_SERVICE);
   final String deviceID = tm.getDeviceId();

   // log debug message containing device ID
   Log.d(LOG_CAT, "getDeviceID: " + deviceID);        

   return deviceID;
}

好的,我想我理解了“final”变量只能赋值一次且由于每个声明中的“final”关键字不能更改,但当方法退出时,两个变量是否都超出范围呢?并且再次调用该方法将只重新分配2个新的最终变量,这些变量再次将在方法退出时超出范围?

对我来说,在这些变量上使用“final”关键字似乎有点奇怪?除非我不明白它们如何影响方法作用域内的局部变量?

有人能告诉我“final”对于方法作用域的影响是什么,或者将这些特定的变量声明为最终变量只是某人做的愚蠢的事情吗?

8个回答

6

final在作用域上没有影响。
它只是防止变量被重新赋值。

它向其他开发人员发出了一个信号,表明这些变量永远不会更改,并且可以防止您意外更改它们。
这在较长的方法中特别有用。

final也是使用匿名内部类中的变量所必需的,因为Java不支持真正的闭包。


5

当方法退出时,这些变量确实会在GC运行时被回收。

final关键字真的只是一个提示:这个变量只被实例化一次,在方法体内部不应该改动它。同样地,声明方法参数为final会禁止它们被重用(在我看来,这是件好事)。

然而请注意,这个关键字只影响对象引用:它并不意味着修改其内部状态的方法将停止工作(典型的例子:设置器)。

另一点需要注意的是:当你省略了final关键字,而且在方法体内没有修改变量,JVM会聪明地优化这种情况。所以你可以省略它。是否使用它,以及在哪里使用它,完全取决于个人口味/编码风格。

最后,声明public static变量为final是个好习惯:否则,任何东西都可以修改它!考虑字符串常量等等。


1

对于final局部变量或参数的范围并没有什么特别之处。

将局部变量或参数声明为final并没有实际作用,而且很少有必要这样做。基本上有两个原因:

  1. 一些开发人员认为任何不需要可变性的东西都应该是不可变的。虽然我从原则上同意(在许多方面,不可变性是一件好事),但我认为对于像Java这样的语言,声明所有内容为final就有点过了。
  2. 如果您的方法包含一个局部或匿名内部类,并且您希望其任何局部变量或参数能够被内部类中的代码访问,那么您必须将它们声明为final。这是Java语言中的一种Lambda表达式,其目的是防止内部类中的代码在变量或参数已经不再有效时尝试修改它们。

0

它们是在它们所在的范围内最终的。这就是它的工作方式。

我想在这种情况下将它们设为最终的目的是防止未来的开发人员在不应该更改它们时更改它们。在这种情况下,这只是一种防御性编码。


0

可读性


说到局部作用域,我发现它的使用是多变的。也就是说,有些程序员会选择使用它(像我一样滥用),而有些人则会节俭地使用它(例如确保类不能被子类化、不可变性等)。

我发现当与一组开发人员一起工作时,要么全部都使用,要么就不使用。一旦你开始在局部作用域中包含final修饰符,你就知道你上瘾了,你的团队除了让你成为一个高效的开发者之外,别无选择。


0

我的看法

将本地变量设置为final是一个好的实践(有利于更好的维护等)。这是减少副作用的一种方式。没有副作用的代码易于理解,因此更易于阅读和维护。


p现在将指向“Another Jack”。...你确定吗?重新分配temp不应该影响p。 - Dawood ibn Kareem
@DavidWallace 谢谢你指出这个问题。我已删除了代码。 - Aravind Yarram

0

过于宗教化的程序员会告诉你,无论何时都要在本地变量(包括方法参数)上标记final

实际上,包括那些程序员在内,没有人这样做。

别费心了。


-1

final 就像 c 语言中的 const,用于原始类型和引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接