Java和Final关键字的使用
我是Java新手,已经用Delphi和C语言编程一段时间了,。我的问题涉及到当变量声明和实例化都发生在同一方法的范围内时,对保存实例化类的变量使用“final”关键字。e、 gJava和Final关键字的使用,java,variables,methods,final,Java,Variables,Methods,Final,我是Java新手,已经用Delphi和C语言编程一段时间了,。我的问题涉及到当变量声明和实例化都发生在同一方法的范围内时,对保存实例化类的变量使用“final”关键字。e、 g private String getDeviceID() { //get the android device id final TelephonyManager tm = (TelephonyManager)GetBaseContext().getSystemSer
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”对方法作用域的影响吗?或者说,将这些特定变量声明为final只是有人做的蠢事吗?它们对所处的作用域是最终的。这就是它的工作方式
我想,在这种情况下,让它们成为最终版本的目的是防止未来的开发人员在不应该更改它们的时候更改它们。在这种情况下,它只是防御性编码。
final
对范围没有影响。它只是防止变量被重新分配 它向其他开发人员发出了这些变量永远不会更改的信号,并防止您意外更改它们。
这在较长的方法中特别有用
final
也是在匿名内部类中使用变量所必需的,因为Java不支持真正的闭包。当方法退出时,只要GC运行,这些变量就会被垃圾收集
final
关键字实际上是一个提示:这个变量实例化一次,您不应该在方法本身的主体中触碰它。类似地,声明方法参数final
禁止重用它们(imho,这是一件好事)
但是请注意,关键字只影响对象引用:它并不意味着此对象引用上修改其内部状态的方法将停止工作(典型示例:setters)
另一个注意事项:当您省略final
关键字,并且不修改方法主体中的变量时,JVM足够聪明,可以优化这种情况。所以,你可以省略它。您是否使用它,以及在何处使用它,是一个品味/编码风格的问题
最后,最好将
公共静态
变量声明为final:否则,任何东西都可以修改它!考虑字符串常量等。final
就像c中的const
用于原语和引用。final局部变量或参数的范围没有什么特别之处
将局部变量或参数声明为final
实际上没有什么作用,也很少有必要。基本上有两个原因:
final
都太过分了final
。这是Java语言中的一个kluge;其目的是防止内部类中的代码在变量或参数不再活动后尝试修改它们说到局部范围,我发现它的用法是可变的。也就是说,一些程序员会选择使用它(并且像我一样滥用它),而一些程序员会谨慎使用它(例如,确保类不能被子类化、不可变等等)
我发现,与一群开发人员合作时,要么是全部,要么什么都没有。一旦你开始在本地范围内包含
最终的
修改器,你就知道你已经上瘾了,你的团队也无能为力(除了让你被解雇……因为你是一名高效的开发人员)。我的观点
将局部变量作为最终变量是一种很好的做法(为了更好地维护等)。这是减少副作用的一种方法。无副作用的代码易于推理,因此可读性更高,易于维护。程序员会告诉您在可以的时候在局部变量(包括方法参数)上标记
final
实际上,没有人这样做,包括那些程序员
不用麻烦了。p现在将指向“另一个杰克”。。。你确定吗?重新分配温度不应影响p@DavidWallace感谢您指出这一点。我删除了密码。