Java 存储一个对象还是直接调用它的方法?
Java storing an object vs directly calling its method?
在Java中可以有两种调用方法的方法:
在调用方法之前实例化和存储对象。
Foo foo = new Foo();
foo.method();
实例化直接调用方法
new Foo().method();
对于最终会再次使用 foo
的情况,采用第一种方法是有意义的。
但是,假设我们知道至少对于当前要求 foo
仅用于调用 method
一次并且永远不会再次使用。哪个选项更适合,为什么?
我知道响应可能非常主观,因此我不是在寻找诸如更短的代码、可读性等原因(如果你愿意,可以随意添加它们)。相反,我主要是根据性能、内存要求、垃圾收集等寻找参数,即使差异可以忽略不计。
之前有人问过这个问题,但是我找不到任何讨论上述论点的问题。
I am primarily looking for arguments based on performance,
没有区别。这个局部变量本质上是“自由的”。如果方法被频繁调用,JIT编译器会将局部变量优化掉。反正对象是刚创建的,所以它的引用在一级缓存
memory requirements,
如果优化器不删除它,局部变量可能会在线程调用堆栈上占用一些额外的 space 字节。此 space 在方法 returns 时被回收和重用,如果不是更快的话。
garbage collection,
GC 通常 如果有一个局部变量从实时线程中的堆栈帧指向它,则不会收集对象。对于 long 运行 方法,这可能很重要:使用局部变量意味着对象将存活更长时间。对于简短的 运行 方法,几乎没有区别。
etc
使用局部变量,您可以在任意一行上设置调试器断点。这允许您在对象创建之后和方法调用之前检查对象的状态。如果没有局部变量,您将不得不深入挖掘:
Foo foo = new Foo();
foo.method();
even if the difference is negligible.
如果你运行处于解释模式(相对于编译到编译为本机),执行局部变量写入和读取(astore
和aload
字节代码说明)可能是可测量的。
在Java中可以有两种调用方法的方法:
在调用方法之前实例化和存储对象。
Foo foo = new Foo();
foo.method();
实例化直接调用方法
new Foo().method();
对于最终会再次使用 foo
的情况,采用第一种方法是有意义的。
但是,假设我们知道至少对于当前要求 foo
仅用于调用 method
一次并且永远不会再次使用。哪个选项更适合,为什么?
我知道响应可能非常主观,因此我不是在寻找诸如更短的代码、可读性等原因(如果你愿意,可以随意添加它们)。相反,我主要是根据性能、内存要求、垃圾收集等寻找参数,即使差异可以忽略不计。
之前有人问过这个问题,但是我找不到任何讨论上述论点的问题。
I am primarily looking for arguments based on performance,
没有区别。这个局部变量本质上是“自由的”。如果方法被频繁调用,JIT编译器会将局部变量优化掉。反正对象是刚创建的,所以它的引用在一级缓存
memory requirements,
如果优化器不删除它,局部变量可能会在线程调用堆栈上占用一些额外的 space 字节。此 space 在方法 returns 时被回收和重用,如果不是更快的话。
garbage collection,
GC 通常 如果有一个局部变量从实时线程中的堆栈帧指向它,则不会收集对象。对于 long 运行 方法,这可能很重要:使用局部变量意味着对象将存活更长时间。对于简短的 运行 方法,几乎没有区别。
etc
使用局部变量,您可以在任意一行上设置调试器断点。这允许您在对象创建之后和方法调用之前检查对象的状态。如果没有局部变量,您将不得不深入挖掘:
Foo foo = new Foo();
foo.method();
even if the difference is negligible.
如果你运行处于解释模式(相对于编译到编译为本机),执行局部变量写入和读取(astore
和aload
字节代码说明)可能是可测量的。