Java中的变量声明放置指南

对于Java变量,似乎有两个可接受的变量声明放置,每个变量都有不同的存在理由

根据Sun的代码约定,我们可以看到:

仅在块的开头放置声明。 (块是由大括号“{”和“}”包围的任何代码。)不要等到第一次使用之前声明变量; 它可能会混淆粗心的程序员并妨碍范围内的代码可移植性。

然而,在备受好评的“代码完整”和其他一些作者主张将变量的范围缩小到最小。 这基本上是等到第一次使用之前声明变量。

尽管我可以看到这两种方法的重点,但这两种方法显然是矛盾的。

我该跟哪个? 对此事有何共识?

变量尽可能接近其使用声明,原因有两个:

  • 垂直的地方
  • 工具提示

垂直局部性使得更容易推理代码块。 读者必须做的扫描越少,就越容易理解代码的作用,以及它的副作用

减少变量范围还可以为自动化工具提供更好的工具提示 ,例如重构。 相关事物越紧密,它们就越明显。

也就是说:如果一个方法足够长以至于上述点可以发挥作用,那么该方法可能已经太长了,并且无论如何都应该重构。

这基本上是等到第一次使用之前声明变量。

事实并非如此,这两种情况并不冲突。 限制变量的范围意味着该变量实际上不存在于该范围之外。 例如

for(int i=0; i<10;i++){ int a = 5; doSomething(a); } 

在这种情况下,a的范围仅限于for block,这就是Code complete引用的内容。

无论如何我同意sun,范围内的变量(类,方法,块等)应该在开头声明。

我个人认为无论哪种方式都没问题。 我认为只要变量名称足够描述,它就不重要了。 再次,这只是我的意见。 我不得不经历许多不是我编写的代码,而且我遇到的变量最大的挫败感是他们的名字不是很具描述性。 大多数IDE都可以选择“转到定义”,因此在您声明它们的位置并不重要。

这两个陈述不一定是矛盾的。 范围由大括号决定,因此如果您在靠近使用它们的位置开始一组新括号,则与Sun编码约定一致。 当然,如果您只是随意插入范围限制,那么这是读取代码流的问题。

但是,我发现在类的顶部声明字段非常重要,尤其是可变字段。 从长远来看,理解一个对象的状态可能是一个类中最难的部分,并且在该类的开头放置声明清楚地说明了该类所具有的重要状态。

我还推荐Joshua Bloch撰写的“Effective Java”,其中有更多理由说明为什么应该首先使用变量。