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

在Java中,变量应该在函数的顶部声明,还是在它们';你需要什么?,java,syntax,variables,coding-style,Java,Syntax,Variables,Coding Style,我正在为一些人清理Java代码,这些人通过在顶部声明所有变量来启动函数,并将它们初始化为null/0/任何值,而不是在以后需要时声明它们 具体的指导方针是什么?是否有这样或那样的优化原因,或者一种方法仅仅是良好的实践?在任何情况下,偏离正确的操作方式都是可以接受的吗?声明变量时尽可能靠近第一个使用变量的位置。这实际上与效率无关,但会使代码更具可读性。变量声明的位置越靠近它的使用位置,以后读取代码时所需的滚动/搜索就越少。在使用变量的第一个位置附近声明变量也会自然地缩小其范围。如果在函数体内部的各

我正在为一些人清理Java代码,这些人通过在顶部声明所有变量来启动函数,并将它们初始化为null/0/任何值,而不是在以后需要时声明它们


具体的指导方针是什么?是否有这样或那样的优化原因,或者一种方法仅仅是良好的实践?在任何情况下,偏离正确的操作方式都是可以接受的吗?

声明变量时尽可能靠近第一个使用变量的位置。这实际上与效率无关,但会使代码更具可读性。变量声明的位置越靠近它的使用位置,以后读取代码时所需的滚动/搜索就越少。在使用变量的第一个位置附近声明变量也会自然地缩小其范围。

如果在函数体内部的各个孤立位置使用了大量变量,则函数太大

如果你的功能是一个可以轻松理解的尺寸,那么“全部提前”和“按需”之间没有区别

唯一一个非前置变量将位于
for
语句的主体中

for( Iterator i= someObject.iterator(); i.hasNext(); ) 

我发现,根据需要声明它们比在开始时声明错误要少。我还发现,在尽可能小的范围内声明它们也可以防止错误

几年前,当我查看由声明位置生成的字节码时,我发现它们或多或少是相同的。根据他们被分配的时间不同,他们的职业差异也不同。甚至像:

for(Object o : list) {
   Object temp = ...;  //was not "redeclared" every loop iteration
}
vs


结果多少是相同的

这是可读性和个人偏好的问题,而不是性能问题。编译器不在乎,反正会生成相同的代码。

我见过有人在函数的顶部和底部声明。我更喜欢顶部,在那里我可以很快看到它们。这是一个选择和偏好的问题

6.3安置

将声明仅放在开头 一块块。(块是任何代码 被大括号“{”和 “}”。)不要等待声明变量 直到他们第一次使用;它可能会混淆 粗心的程序员和阻碍代码 范围内的可移植性

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

    if (condition) {
        int int2 = 0;     // beginning of "if" block
        ...
    }
}
这条规则的一个例外是 for循环的索引,在Java中 可以在for语句中声明:

for (int i = 0; i < maxLoops; i++) { ... }

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

在函数顶部声明变量是C语言的一种保留(在C语言中是必需的),并且绝对没有任何优势(变量范围只存在于源代码中,在字节码中,所有局部变量在堆栈上都是按顺序存在的)。永远不要这样做


有些人可能会试图通过声称这种做法“更整洁”来为这种做法辩护,但任何在方法中“组织”代码的需要通常都强烈地表明该方法太长了。

我目前正在做同样的事情。我正在修改的代码中的所有变量都在函数顶部声明。我已经看到,我一直在研究这个问题,有几个变量被声明但从未使用过,或者它们被声明,并且正在使用它们进行操作(即解析
字符串
,然后使用字符串中的日期/时间值设置
日历
对象)但是,生成的
Calendar
对象永远不会被使用


我将通过从顶部获取声明并在函数中将其向下移动到离使用位置更近的位置来检查和清理这些声明。

在比所需范围更广的范围内定义变量会在很大程度上妨碍理解。有限的范围表明此变量仅对这一小块代码有意义,您在进一步阅读时无法考虑。这是一个非常重要的问题,因为大脑有很小的短期工作记忆(它说平均来说你只能记录7件事情)。少了一件重要的事情


类似地,您确实应该尽量避免字面意义上的变量。尝试一次分配所有内容,并将其声明为最终,以便读者了解这一点。不必跟踪某件事情是否发生了变化,这确实会减少认知负荷。

我认为,实际上可以客观证明,顶部声明样式更容易出错

如果您通过随机移动行(以模拟合并失败或某人不假思索地剪切+粘贴)在任一样式中对测试代码进行变异,那么顶部声明样式在功能错误的情况下编译的可能性更大

我不认为declare在高层有任何与个人偏好无关的优势

因此,假设您想要编写可靠的代码,请学习更喜欢执行即时声明。

来自:

4.8.2.2需要时宣布

局部变量通常不会在开始时声明 包含块或类似块的构造。相反,局部变量是 声明接近其首次使用的点(在合理范围内),以 尽量缩小其范围。局部变量声明通常具有 初始值设定项,或在声明后立即初始化


好吧,我会遵循Google的做法,从表面上看,在方法/函数顶部声明所有变量似乎会“更整洁”,很明显,在必要时声明变量是有益的。不过,这是主观的,只要你觉得直观就行。

原则:将局部变量声明放在尽可能接近其首次使用的位置,而不是简单地放在方法的顶部。考虑这个例子:

/** 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;
}
这里,局部变量helpblub放在需要的地方,
int count;
...
myMethod() {
    if (condition) {
        int count = 0;     // AVOID!
        ...
    }
    ...
}
/** 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;
}