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"关键字似乎有点奇怪?除非我不理解它们如何影响方法范围内的局部变量?
有人可以告诉我"最终"对方法范围的影响是什么,或者将这些特定变量声明为最终只是某人做的蠢事?
final对范围没有影响.
它只是阻止重新分配变量.
它向其他开发人员发出信号,告知这些变量永远不会改变,并且它会阻止您意外更改它们.
这在较长的方法中特别有用.
final 因为Java不支持真正的闭包,所以也需要在匿名内部类中使用变量.
一旦GC退出时GC就会运行,这些变量确实会被垃圾收集.
该final关键字是真的有一个提示:这个变量被实例化一次,你不应该去碰它的方法本身的身体.类似地,声明方法参数final禁止它们重用(其中,imho,这是一件好事).
但请注意,关键字仅影响对象引用:它并不意味着此对象引用上修改其内部状态的方法将不再起作用(典型示例:setter).
另一个注意事项:当您省略final关键字,并且不修改方法体中的变量时,JVM足够智能以优化此情况.所以,你可以省略它.无论您是否使用它,以及您使用它,都是品味/编码风格的问题.
最后,将public static变量声明为final 是一个好习惯:否则,任何东西都可以修改它!想想字符串常量等