java对象初始化的最佳实践

java对象初始化的最佳实践,java,object,initialization,Java,Object,Initialization,这些方法之间是否存在实际差异?内存、GC、性能等 while...{ Object o=new Object(); ... o=new Object(); ... } 及 在第一个示例中,在while循环完成后,o将超出范围 现在,如果你没有在while循环之外使用o,即使你把它引用的对象加载到一个不同的结构中,这也没问题,但是你将无法在循环之外访问o 而且,这只是吹毛求疵,但它们都不会编译,因为您声明了对象o两次 在第一个示例中,在while循环完成后,o将超出范围

这些方法之间是否存在实际差异?内存、GC、性能等

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

在第一个示例中,在while循环完成后,o将超出范围

现在,如果你没有在while循环之外使用o,即使你把它引用的对象加载到一个不同的结构中,这也没问题,但是你将无法在循环之外访问o

而且,这只是吹毛求疵,但它们都不会编译,因为您声明了对象o两次

在第一个示例中,在while循环完成后,o将超出范围

现在,如果你没有在while循环之外使用o,即使你把它引用的对象加载到一个不同的结构中,这也没问题,但是你将无法在循环之外访问o


而且,这只是吹毛求疵,但它们都不会编译,因为您声明了对象o两次

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

最小范围总是增加可读性并将错误倾向降至最低

同样,如果创建一些对象的成本太高,比如线程、数据库连接,那么应该考虑重用。它们通常不是在循环内创建的,而是缓存在池中


这就是为什么连接池如此流行。

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

最小范围总是增加可读性并将错误倾向降至最低

同样,如果创建一些对象的成本太高,比如线程、数据库连接,那么应该考虑重用。它们通常不是在循环内创建的,而是缓存在池中


这就是为什么连接池如此流行的原因。

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

在选项1中,循环完成时,对象将有资格使用GC,而在选项2中,对象将持续到方法结束

摘自Java第二版:

最小化局部变量范围的最强大的技术 就是在第一次使用它的地方声明它。如果变量在使用前声明,则 还有一件事让读者分心,他们想弄清楚是什么 该计划确实如此。当使用变量时,读者可能记不起来了 变量的类型或初始值

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

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

摘自《有效Java第二版:

最小化局部变量范围的最强大的技术 就是在第一次使用它的地方声明它。如果变量在使用前声明,则 还有一件事让读者分心,他们想弄清楚是什么 该计划确实如此。当使用变量时,读者可能记不起来了 变量的类型或初始值

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


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

有一个区别。第一个代码未编译,而第二个代码编译成功。在这里发布之前,请测试您的代码。尽管在GC和内存使用方面存在差异,但这些都可以忽略不计。除非您对代码进行了过度简化,否则当您在同一范围内重新声明o时,您将在第一个代码上收到编译错误。唯一显著的区别是引用变量Ohover的范围,编译器将对其进行优化并尝试限制范围。第二个示例的反编译代码类似于,`while{Object o=new Object;o
=新对象;}`有一个区别。第一个代码未编译,而第二个代码编译成功。在这里发布之前,请测试您的代码。尽管在GC和内存使用方面存在差异,但这些都可以忽略不计。除非您对代码进行了过度简化,否则当您在同一范围内重新声明o时,您将在第一个代码上收到编译错误。唯一显著的区别是引用变量Ohover的范围,编译器将对其进行优化并尝试限制范围。第二个示例的反编译代码类似于,`while{Object o=new Object;o=new Object;}`Edited。。。动态编写这些:-\Edited。。。在飞行中写下这些:-\
Object o;
while...{
   o=new Object();
   ...
   o=new Object();
   ...
}