为什么下面的工作正常?
String str;
while (condition) {
str = calculateStr();
.....
}
但是下面这个被认为是危险的/不正确的:
while (condition) {
String str = calculateStr();
.....
}
有必要在循环之外声明变量吗?
为什么下面的工作正常?
String str;
while (condition) {
str = calculateStr();
.....
}
但是下面这个被认为是危险的/不正确的:
while (condition) {
String str = calculateStr();
.....
}
有必要在循环之外声明变量吗?
当前回答
我认为回答你的问题最好的资源是下面的帖子:
在循环前或循环中声明变量的区别?
根据我的理解,这个东西是语言依赖的。IIRC Java优化了这一点,所以没有任何区别,但JavaScript(例如)将在每次循环中完成整个内存分配。特别是在Java中,我认为当完成分析时,第二个程序会运行得更快。
其他回答
如果你的calculateStr()方法返回null,然后你试图在str上调用一个方法,你有NullPointerException的风险。
更一般地说,避免使用空值变量。顺便说一下,它对类属性更强。
在最小范围内声明对象可以提高可读性。
性能对于今天的编译器来说并不重要。(在此场景中) 从维护的角度来看,第二种选择更好。 在同一个地方声明和初始化变量,在尽可能窄的范围内。
正如Donald Ervin Knuth所说:
“我们应该忘记小的效率,大约97%的时候: 过早的优化是万恶之源”
例如,程序员让性能考虑影响一段代码的设计的情况。这可能导致设计不那么清晰,或者代码不正确,因为优化使代码变得复杂,而程序员被优化分散了注意力。
正如很多人指出的那样,
String str;
while(condition){
str = calculateStr();
.....
}
没有比这更好的了:
while(condition){
String str = calculateStr();
.....
}
因此,如果你不重用变量,就不要在变量作用域之外声明变量。
变量的声明应该尽可能靠近使用它们的地方。
它使RAII(资源获取初始化)更容易。
它使变量的范围保持紧凑。这让优化器工作得更好。
这两个例子的结果是一样的。但是,第一个函数为你提供了在while循环之外使用str变量的方法;第二个则不然。