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