在Java中,变量应该声明在函数的顶部,还是需要它们?

Ken*_*Ken 36 java variables syntax coding-style

我正在通过将所有变量声明为最高位置并将它们初始化为null/0 /而不是将它们声明为以后需要它们来为那些启动其功能的人清理Java代码.

针对此的具体指导原则是什么?对于这种或那种方式是否存在优化原因,或者只是一种良好的做法?是否存在偏离任何正确方法的可接受的情况?

Bil*_*ard 82

将变量声明为尽可能靠近您使用它们的第一个点.它与效率无关,但使您的代码更具可读性.声明变量越接近使用它的位置,稍后读取代码时您必须进行的滚动/搜索越少.声明变量更接近他们使用的第一个位置也将自然地缩小其范围.


Mic*_*rdt 33

正确的方法是在第一次使用变量时准确地声明变量,并最小化它们的范围,以便使代码更容易理解.

在函数顶部声明变量是C的保留(它是必需的),并且绝对没有优势(变量范围仅存在于源代码中,在字节代码中,所有局部变量仍然按顺序存在于堆栈中).只是不要这样做,永远.

有些人可能会试图通过声称它"整洁"来捍卫这种做法,但是在方法中"组织"代码的任何需要通常都表明该方法太长了.


Tim*_*Tim 21

Java代码约定,第6章声明:

6.3安置

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

void myMethod() {
    int int1 = 0;         // beginning of method block

    if (condition) {
        int int2 = 0;     // beginning of "if" block
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

规则的一个例外是for循环的索引,在Java中可以在for语句中声明:

for (int i = 0; i < maxLoops; i++) { ... }
Run Code Online (Sandbox Code Playgroud)

避免在较高级别隐藏声明的本地声明.例如,不要在内部块中声明相同的变量名称:

int count;
...
myMethod() {
    if (condition) {
        int count = 0;     // AVOID!
        ...
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 羞辱你,太阳,羞辱你! (25认同)
  • 我怀疑这篇文章很老,"混淆粗心的程序员"指的是大量的Java新手程序员.如今这种情况非常罕见,但文本从未修改过. (5认同)
  • *以上仅供参考.你们俩都没错,但我个人最喜欢Bill&S.Lott的答案* (2认同)
  • 我完全同意这个答案。我既不是来自Java世界,也不是来自C世界,我只是喜欢它。像往常一样,你们正在辩论一些偏爱的问题... (2认同)

S.L*_*ott 14

如果你在函数体内的各个孤立位置使用了kabillion变量,那么你的函数太大了.

如果您的功能是一个易于理解的尺寸,那么"所有前端"和"根据需要"之间没有区别.

唯一的非前置变量将出现在for声明的正文中.

for( Iterator i= someObject.iterator(); i.hasNext(); ) 
Run Code Online (Sandbox Code Playgroud)


Nik*_*apu 6

来自Google Java 风格指南

4.8.2.2 需要时声明

局部变量通常不会在其包含块或类块构造的开始处声明。相反,局部变量在接近它们第一次使用的点(在合理范围内)被声明,以最小化它们的范围。局部变量声明通常具有初始化器,或者在声明后立即初始化。

好吧,我会遵循 Google 的做法,从表面上看,在方法/函数的顶部声明所有变量似乎会“更整洁”,很明显,根据需要声明变量是有益的。不过,这是主观的,无论您感觉如何直观。


Jam*_*hek 5

我发现根据需要声明它们比在开始时声明它们导致更少的错误.我还发现,在最小范围内声明它们也可以防止错误.

当我查看几年前声明位置生成的字节码时,我发现它们或多或少相同.根据分配时间的不同,存在着偶然的差异.甚至像:

for(Object o : list) {
   Object temp = ...;  //was not "redeclared" every loop iteration
}
Run Code Online (Sandbox Code Playgroud)

VS

Object temp;
for(Object o : list) {
   temp = ...; //nearly identical bytecoode, if not exactly identical.
}
Run Code Online (Sandbox Code Playgroud)

出来或多或少相同


Jer*_*ron 5

我此刻正在做同样的事情.我正在重做的代码中的所有变量都在函数的顶部声明.我已经看到,我一直在仔细研究这几个变量被声明但是从未使用过或者它们被声明并且正在用它们进行操作(即解析a String然后Calendar用字符串中的日期/时间值设置一个对象)但是Calendar从来没有使用过的对象.

我将通过从顶部获取声明并将其在函数中向下移动到更靠近其使用位置的位置来进行清理.


Ant*_*sma 5

在比所需范围更广的范围内定义变量会妨碍可理解性.有限范围表示此变量仅对这一小块代码有意义,您无法在进一步阅读时思考.这是一个非常重要的问题,因为大脑具有微小的短期工作记忆(它表示平均只能跟踪7件事情).少跟踪一件事是很重要的.

同样,你应该尽量避免字面意义上的变量.尝试将所有内容分配一次,并将其声明为最终内容,以便读者知道.无需跟踪是否有任何变化确实会削弱认知负担.


小智 5

原则:将局部变量声明放在尽可能靠近它们第一次使用的地方,而不是简单地放在方法的顶部。考虑这个例子:

/** Return true iff s is a blah or a blub. */
public boolean checkB(String s) {
    // Return true if s is a blah
    ... code to return true if s is a blah ... 

    // Return true if s is a blub. */
    int helpblub= s.length() + 1;
    ... rest of code to return true is s is a blah.

    return false;
}
Run Code Online (Sandbox Code Playgroud)

在这里,局部变量 helpblub 被放置在需要的地方,在代码中测试 s 是否是一个 blub。它是实现“Return true is s is a blub”的代码的一部分。将 helpblub 的声明作为方法的第一条语句绝对没有逻辑意义。可怜的读者会想知道,为什么会有那个变量?它是做什么用的?