Java和Final关键字的使用

use*_*206 4 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;
}
Run Code Online (Sandbox Code Playgroud)

好吧所以我认为我得到的事实是"最终"变量只能分配给一次,并且由于每个声明上的"final"关键字而无法更改,但是当方法退出时,两个变量都不会超出范围吗?并再次调用该方法将简单地重新分配2个新的最终变量,这些变量在方法退出时将再次超出范围?

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

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

SLa*_*aks 6

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

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

final 因为Java不支持真正的闭包,所以也需要在匿名内部类中使用变量.


fge*_*fge 5

一旦GC退出时GC就会运行,这些变量确实会被垃圾收集.

final关键字是真的有一个提示:这个变量被实例化一次,你不应该去碰它的方法本身的身体.类似地,声明方法参数final禁止它们重用(其中,imho,这是一件好事).

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

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

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