为什么下面的工作正常?

String str;
while (condition) {
    str = calculateStr();
    .....
}

但是下面这个被认为是危险的/不正确的:

while (condition) {
    String str = calculateStr();
    .....
}

有必要在循环之外声明变量吗?


当前回答

正如很多人指出的那样,

String str;
while(condition){
    str = calculateStr();
    .....
}

没有比这更好的了:

while(condition){
    String str = calculateStr();
    .....
}

因此,如果你不重用变量,就不要在变量作用域之外声明变量。

其他回答

实际上,上面提到的问题是一个编程问题。你想如何编写代码?在哪里需要访问“STR”?声明一个局部用作全局变量的变量是没有用的。我相信这是编程基础知识。

变量的声明应该尽可能靠近使用它们的地方。

它使RAII(资源获取初始化)更容易。

它使变量的范围保持紧凑。这让优化器工作得更好。

如果你的calculateStr()方法返回null,然后你试图在str上调用一个方法,你有NullPointerException的风险。

更一般地说,避免使用空值变量。顺便说一下,它对类属性更强。

如果你想在循环外使用STR;在外面宣布。否则,第二版就可以了。

在最小范围内声明对象可以提高可读性。

性能对于今天的编译器来说并不重要。(在此场景中) 从维护的角度来看,第二种选择更好。 在同一个地方声明和初始化变量,在尽可能窄的范围内。

正如Donald Ervin Knuth所说:

“我们应该忘记小的效率,大约97%的时候: 过早的优化是万恶之源”

例如,程序员让性能考虑影响一段代码的设计的情况。这可能导致设计不那么清晰,或者代码不正确,因为优化使代码变得复杂,而程序员被优化分散了注意力。