Java和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”关键字似乎有点奇怪? 除非我不理解它们如何影响方法范围内的局部变量?
有人可以告诉我“最终”对方法范围的影响是什么,或者将这些特定变量声明为最终只是某人做的蠢事?
final
对范围没有影响。
它只是阻止重新分配变量。
它向其他开发人员发出信号,告知这些变量永远不会改变,并且它会阻止您意外更改它们。
这在较长的方法中特别有用。
为了在匿名内部类中使用变量,还需要final
,因为Java不支持真正的闭包。
一旦GC退出时GC就会运行,这些变量确实会被垃圾收集。
final
关键字实际上是一个提示:这个变量被实例化一次,你不应该在方法体的主体中触摸它。 同样,声明方法参数final
禁止它们重用(imho,这是一件好事)。
但请注意,关键字仅影响对象引用:它并不意味着此对象引用上修改其内部状态的方法将不再起作用(典型示例:setter)。
另一个注意事项:当您省略final
关键字,并且不修改方法体中的变量时,JVM足够智能以优化此情况。 所以,你可以省略它。 无论您是否使用它,以及您使用它,都是品味/编码风格的问题。
最后,将public static
变量声明为final是一个好习惯:否则,任何东西都可以修改它! 想想字符串常量等
final
局部变量或参数的范围没有什么特别之处。
将局部变量或参数声明为final
并不是很有用,并且很少需要。 基本上有两个原因:
- 一些开发人员认为,任何不需要变量的东西都应该是不可变的。 虽然我原则上同意(不变性在许多方面都是好事),但我认为对于像Java这样的语言,宣告
final
一切都是过分的。 - 如果您的方法包含本地或匿名内部类,并且您希望其内部类中的代码可以访问其任何局部变量或参数,则必须将它们声明为
final
。 这是Java语言中的一个方面; 其目的是防止内部类中的代码在变量或参数不再存活后尝试修改它们。
他们是他们所处的范围的最终决定。这就是它的工作方式。
我想在这种情况下让它们成为最终的关键是防止未来的开发人员在不应该更改时更改它们。 在这种情况下,这只是防御性编码。
可读性
说到本地范围,我发现它的用法是可变的。 也就是说,一些程序员会选择使用它(并且滥用它……像我一样),有些程序员会谨慎地使用它(例如,确保一个类不能被子类化,不变性等等)。
我发现在与一组开发人员合作时,它要么全部,要么全无。 一旦你开始在本地范围内包含final
修饰符,你就会知道你被迷住了,你的团队可以做的并不多(除了让你被解雇……不知怎的……作为一个有效的开发者)。
我的观点
将局部变量作为最终变量是一种很好的做法(为了更好的维护等)。 这是减少副作用的一种方法。 无副作用的代码易于推理,因此更易读,易于维护。
过度宗教的程序员会告诉你尽可能在局部变量(包括方法参数)上标记final
。
在实践中,没有人这样做,包括那些程序员。
不要打扰。
对于基元和引用, final
类似于const
in c。