这些方法之间是否存在实际差异? (记忆,GC,表现等?)
while...{
Object o=new Object();
...
o=new Object();
...
}
和
Object o;
while...{
o=new Object();
...
o=new Object();
...
}
答案 0 :(得分:2)
来自 Effective Java 2nd Edition :
最小化局部变量范围的最强大技术 是声明它在第一次使用的位置。如果变量在使用之前被声明,那就是 只是杂乱无章 - 还有一件事要分散试图找出问题的读者的注意力 该计划。在使用变量时,读者可能不记得了 变量的类型或初始值。
过早声明局部变量可能导致其范围不仅扩展 太早了,也结束得太晚了。局部变量的范围从 它被声明到封闭块的末尾的点。如果变量是 在使用它的块之外声明,它在程序之后仍然可见 退出那个街区。如果在其区域之前或之后意外使用变量 预期用途,后果可能是灾难性的。
换句话说,在您的情况下,性能(CPU,内存)的差异是无关紧要的。更重要的是程序的语义和正确性,这在第一个代码示例中更好。
答案 1 :(得分:1)
在您的第一个示例中,o
将在while循环结束后超出范围。
现在,如果你实际上没有在while循环之外使用o
(即使你将它引用的对象加载到另一个结构中),这很好,但你将无法访问{ {1}}在循环之外
同样,这只是挑剔,但这些都不会编译,因为你声明o
两次。
答案 2 :(得分:1)
我认为你需要在对象重用和垃圾收集+可读性的资格之间进行权衡。
最小范围总是提高可读性&最大限度地减少错误倾向。
同样,如果某个对象的创建成本太高(如线程,数据库连接),则应考虑重用。它们通常不在循环内创建,而是缓存在池中。
答案 3 :(得分:1)
对于选项1,当循环结束时,对象将符合GC的条件,而在选项2中,对象将持续到方法结束。