Java和Final关键字的使用

时间:2011-12-30 02:58:33

标签: java variables methods final

我是Java新手,已经在Delphi和C#中编程了一段时间。我的问题涉及当变量声明和实例化都发生在同一方法的范围内时,变量上使用“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”关键字而无法更改,但是当两个变量都没有超出范围时方法退出?并再次调用该方法将简单地重新分配2个新的最终变量,这些变量在方法退出时将再次超出范围?

对我而言,在这些变量上使用“final”关键字似乎有点奇怪?除非我不理解它们如何影响方法范围内的局部变量?

有人可以告诉我“最终”对方法范围的影响是什么,或者将这些特定变量声明为最终只是某人做的蠢事?

8 个答案:

答案 0 :(得分:6)

final对范围没有影响。
它只是阻止重新分配变量。

它向其他开发者发出信号,告知这些变量永远不会改变,并且它会阻止您意外更改它们 这在较长的方法中特别有用。

为了在匿名内部类中使用变量,还需要

final,因为Java不支持真正的闭包。

答案 1 :(得分:5)

当方法退出时,GC将立即进行垃圾收集。

final关键字实际上是一个提示:这个变量实例化一次,你不应该在方法体的主体中触摸它。同样,声明方法参数final禁止重用它们(imho,这是一件好事)。

但请注意,关键字仅影响对象引用:它并不意味着此对象引用上修改其内部状态的方法将不再起作用(典型示例:setter)。

另一个注意事项:当您省略final关键字,并且不修改方法体中的变量时,JVM足够智能以优化此情况。所以,你可以省略它。无论你是否使用它,以及你使用它的地方,都是品味/编码风格的问题。

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

答案 2 :(得分:1)

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

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

  1. 一些开发人员认为任何不需要变量的东西都应该是不可变的。虽然我原则上同意(不变性在许多方面都是好事),但我认为对于像Java这样的语言,声明所有内容final都过分了。
  2. 如果您的方法包含本地或匿名内部类,并且您希望其内部类中的代码可以访问其任何局部变量或参数,则必须声明它们final。这是Java语言中的一个方面;其目的是防止内部类中的代码在变量或参数不再存活后尝试修改它们。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

对于基元和引用,

finalconst类似。

答案 5 :(得分:0)

可读性


说到本地范围,我发现它的用法是可变的。也就是说,一些程序员会选择使用它(并滥用它......像我一样),有些程序员会谨慎使用它(例如确保一个类不能被子类化,不变等等)。

我发现在与一组开发人员合作时,它要么全部,要么全无。一旦你开始在本地范围内包含final修饰符,你知道你被迷住了,你的团队可以做的不多(除了让你解雇......不知何故......因为有效< / em>开发人员)。

答案 6 :(得分:0)

我的观点

将局部变量作为最终变量是一种很好的做法(为了更好的维护等)。这是减少副作用的一种方法。副作用免费代码易于推理,因此更易读,易于维护。

答案 7 :(得分:0)

过度宗教的程序员会告诉你在可能的情况下在局部变量(包括方法参数)上标记final

在实践中,没有人这样做,包括那些程序员。

不要打扰。