java对象初始化的最佳实践

时间:2012-11-09 16:30:24

标签: java object initialization

这些方法之间是否存在实际差异? (记忆,GC,表现等?)

while...{
   Object o=new Object();
   ...
   o=new Object();
   ...
}

Object o;
while...{
   o=new Object();
   ...
   o=new Object();
   ...
}

4 个答案:

答案 0 :(得分:2)

来自 Effective Java 2nd Edition

  

最小化局部变量范围的最强大技术   是声明它在第一次使用的位置。如果变量在使用之前被声明,那就是   只是杂乱无章 - 还有一件事要分散试图找出问题的读者的注意力   该计划。在使用变量时,读者可能不记得了   变量的类型或初始值。

     

过早声明局部变量可能导致其范围不仅扩展   太早了,也结束得太晚了。局部变量的范围从   它被声明到封闭块的末尾的点。如果变量是   在使用它的块之外声明,它在程序之后仍然可见   退出那个街区。如果在其区域之前或之后意外使用变量   预期用途,后果可能是灾难性的。

换句话说,在您的情况下,性能(CPU,内存)的差异是无关紧要的。更重要的是程序的语义和正确性,这在第一个代码示例中更好。

答案 1 :(得分:1)

在您的第一个示例中,o将在while循环结束后超出范围。

现在,如果你实际上没有在while循环之外使用o(即使你将它引用的对象加载到另一个结构中),这很好,但你将无法访问{ {1}}在循环之外

同样,这只是挑剔,但这些都不会编译,因为你声明o两次。

答案 2 :(得分:1)

我认为你需要在对象重用和垃圾收集+可读性的资格之间进行权衡。

最小范围总是提高可读性&最大限度地减少错误倾向。

同样,如果某个对象的创建成本太高(如线程,数据库连接),则应考虑重用。它们通常不在循环内创建,而是缓存在池中。

这就是为什么连接池和& Thread Pool非常受欢迎。

答案 3 :(得分:1)

对于选项1,当循环结束时,对象将符合GC的条件,而在选项2中,对象将持续到方法结束。