在Java中,有两种方法可以调用方法:
在调用方法之前实例化并存储对象。
Foo foo = new Foo();
foo.method();
实例化并直接调用方法
new Foo().method();
对于最终再次使用foo
的情况,采用第一种方法是有意义的。
然而,假设我们知道,至少对于当前需求,foo
只用于调用method
一次,再也不会使用。哪种选择更合适,为什么?
我知道响应可能是非常主观的,因此我不会寻找诸如代码较短、可读性等原因(如果你想添加,请随意添加(。相反,我主要寻找基于性能、内存需求、垃圾收集等的参数,即使差异可以忽略不计。
这个问题以前有人问过,但我找不到任何讨论上述论点的问题。
我主要是在寻找基于性能的参数,
没有区别。这个局部变量本质上是";免费";。如果频繁调用该方法,JIT编译器将优化本地变量。无论如何,rhe对象刚刚创建,因此它的引用在一级缓存中
内存需求,
如果优化器不删除它,局部变量可能会在线程调用堆栈上占用一些额外的字节空间。当方法返回时(如果不是更早的话(,该空间将被回收和重用。
垃圾收集,
如果有一个局部变量从活动线程中的堆栈帧指向GC,则GC通常不会收集对象。对于长时间运行的方法来说,这可能很重要:使用局部变量意味着对象的生存时间更长。对于短期运行的方法,几乎没有区别。
etc
使用本地变量,可以在任意一行设置调试器断点。这允许您在创建对象之后和方法调用之前检查对象的状态。如果没有局部变量,你将不得不更深入地挖掘:
Foo foo = new Foo();
foo.method();
即使差异可以忽略不计。
如果您在解释模式下运行(而不是编译为编译为本机(,则本地变量写和读(astore
和aload
字节代码指令(的执行可能是可测量的。