Java存储对象与直接调用其方法



在Java中,有两种方法可以调用方法:

在调用方法之前实例化并存储对象。

Foo foo = new Foo();
foo.method();

实例化并直接调用方法

new Foo().method();

对于最终再次使用foo的情况,采用第一种方法是有意义的。

然而,假设我们知道,至少对于当前需求,foo只用于调用method一次,再也不会使用。哪种选择更合适,为什么?

我知道响应可能是非常主观的,因此我不会寻找诸如代码较短、可读性等原因(如果你想添加,请随意添加(。相反,我主要寻找基于性能、内存需求、垃圾收集等的参数,即使差异可以忽略不计。

这个问题以前有人问过,但我找不到任何讨论上述论点的问题。

我主要是在寻找基于性能的参数,

没有区别。这个局部变量本质上是";免费";。如果频繁调用该方法,JIT编译器将优化本地变量。无论如何,rhe对象刚刚创建,因此它的引用在一级缓存中

内存需求,

如果优化器不删除它,局部变量可能会在线程调用堆栈上占用一些额外的字节空间。当方法返回时(如果不是更早的话(,该空间将被回收和重用。

垃圾收集,

如果有一个局部变量从活动线程中的堆栈帧指向GC,则GC通常不会收集对象。对于长时间运行的方法来说,这可能很重要:使用局部变量意味着对象的生存时间更长。对于短期运行的方法,几乎没有区别。

etc

使用本地变量,可以在任意一行设置调试器断点。这允许您在创建对象之后和方法调用之前检查对象的状态。如果没有局部变量,你将不得不更深入地挖掘:

Foo foo = new Foo();
foo.method();

即使差异可以忽略不计。

如果您在解释模式下运行(而不是编译为编译为本机(,则本地变量写和读(astoreaload字节代码指令(的执行可能是可测量的。

最新更新