2011-12-30 51 views
4

我是新来的Java在Delphi和C#中编写了一段时间。我的问题涉及在变量声明和实例都在同一方法的范围内发生时,在包含实例化类的变量上使用“final”关键字。例如Java和使用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; 
} 

好了,所以我觉得我得到的是“最终”变量永远只能一次分配,不能因改变在每个申报的“最后”关键字的事实,但不要两个变量出门方法退出时的范围?并再次调用该方法将简单地重新分配2个新的最终变量,它们将再次超出方法退出的范围。

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

有人能告诉我“final”对于方法范围有什么影响,或者将这些特定变量声明为最终只是某人做的一个哑巴屁事?

回答

0

他们对他们所处的范围是最终的。这就是它的工作方式。

我想在这种情况下让他们成为最终的目的是为了防止未来的开发者在不应该改变时改变他们。这种情况只是防守编码。

5

final对范围没有影响。
它只是防止变量被重新分配。

它作为一个信号给其他开发人员,这些变量永远不会改变,并且它可以防止您意外更改它们。
这在更长的方法中特别有用。

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

5

只要GC在方法退出时运行,这些变量的确将被垃圾收集。

final关键字真的存在一个提示:这个变量被实例化了一次,你不应该在方法本身中触及它。同样,声明方法参数final禁止它们的重用(这是imho,是件好事)。

但请注意,关键字只影响对象引用:它并不意味着此对象上的方法引用修改其内部状态的方法将停止工作(典型示例:setters)。

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

最后,最好将public static变量声明为final:否则,任何事情都可以修改它!认为字符串常量等

0

final就像const在C为原语和参考。

1

局部变量或参数的范围没有什么特别之处。

声明一个局部变量或参数为final并不真正做太多而且也很少有必要。基本上有两个原因:

  1. 一些开发人员认为,任何不需要可变的东西都应该是不可变的。尽管我原则上同意(在许多方面不变性是一件好事),但我认为对于像Java这样的语言,声明所有内容final都会过度。
  2. 如果你的方法包含一个本地或匿名的内部类,并且你想让它的任何局部变量或参数可以被内部类的代码访问,你必须声明它们为final。这是Java语言中的一个难题;其目的是防止内部类中的代码在变量或参数不再有效时尝试修改这些变量或参数。
0

可读性


当涉及到局部范围,我发现它的用途是可变的。也就是说,一些程序员会选择使用它(并滥用它......和我一样),有些程序员会谨慎使用它(例如,以确保类不能被分类,不可变性等)。

我发现在与一群开发人员一起工作时,它可能是全部,或者什么都不是。一旦你开始在局部范围内包括final修饰符,你就会知道你已经迷上了,并且你的团队可以做的事情并不多(除非让你被解雇......不知何故......因为他是有效的开发者)。

0

我的角度来看

这是一个很好的做法(为了更好的维护等),使局部变量决赛。这是减少副作用的一种方法。无副作用的代码很容易推理,因此更易读,易于维护。

+0

p现在将指向“另一个杰克”。 ... 你确定?重新分配温度不应该影响p。 – 2011-12-30 03:20:34

+0

@DavidWallace感谢您指出这一点。我删除了代码。 – 2011-12-30 03:28:51

0

过分虔诚的程序员会告诉你尽可能在局部变量(包括方法参数)上标记final

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

不要打扰。