Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java和Final关键字的使用_Java_Variables_Methods_Final - Fatal编程技术网

Java和Final关键字的使用

Java和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

我是Java新手,已经用Delphi和C语言编程一段时间了,。我的问题涉及到当变量声明和实例化都发生在同一方法的范围内时,对保存实例化类的变量使用“final”关键字。e、 g

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
实际上没有什么作用,也很少有必要。基本上有两个原因:

  • 一些开发人员认为,任何不需要可变的东西都应该是不变的。虽然我在原则上同意(不变性在许多方面都是一件好事),但我认为对于Java这样的语言来说,声明一切
    final
    都太过分了
  • 如果您的方法包含一个本地或匿名内部类,并且您希望内部类中的代码可以访问它的任何本地变量或参数,那么您必须声明它们
    final
    。这是Java语言中的一个kluge;其目的是防止内部类中的代码在变量或参数不再活动后尝试修改它们
  • 可读性
    说到局部范围,我发现它的用法是可变的。也就是说,一些程序员会选择使用它(并且像我一样滥用它),而一些程序员会谨慎使用它(例如,确保类不能被子类化、不可变等等)


    我发现,与一群开发人员合作时,要么是全部,要么什么都没有。一旦你开始在本地范围内包含
    最终的
    修改器,你就知道你已经上瘾了,你的团队也无能为力(除了让你被解雇……因为你是一名高效的开发人员)。

    我的观点


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

    程序员会告诉您在可以的时候在局部变量(包括方法参数)上标记
    final

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


    不用麻烦了。

    p现在将指向“另一个杰克”。。。你确定吗?重新分配温度不应影响p@DavidWallace感谢您指出这一点。我删除了密码。