将值存储为变量还是再次调用方法更好?

最近,我开始学习一些Java。 从我已经了解的JVM开始,看起来JIT在需要CPU周期的操作(即调用方法)上使得它非常快,但也使它对内存感到饥饿。 因此,当我需要与之前相同的方法输出相同的输出时,通常更好的方法是将输出存储在变量中并再次使用它 – 同时将其保存在内存中 – 或者再次调用相同的方法?

最好将输出保存在变量中,而不是再次调用该函数。 只要需要,变量就会保存在内存中。 之后,自动垃圾收集将负责将其从内存中释放出来。 但是如果你调用这个函数,每次调用它时都会占用内存的激活记录堆栈。 因此,如果您希望您的程序不要满足内存,最好将结果存储在变量中,并在需要的地方使用它。

据我所知,这是问哪个更好

Bar bar = foo.getBar(); bar.donkey(); ... bar.kong(); 

要么

 foo.getBar().donkey(); ... foo.getBar().kong(); 

除非getBar价格昂贵,否则不太可能存在显着的性能差异。 同样,内存不太可能成为问题。 专注于可理解性。

有不同的意见。

我相信Martin Fowler更喜欢后者。 代码是独立的,并且可能更容易重构。

我认为重构符合可理解性的目的。 前者告诉我,两个调用中使用的对象确实有一个共同的来源,并且它是[类型]的奖励。 它通常更明确,虽然更详细,但是进展较少。

另一方面,您可能希望将其转换为:

 foo.donkey(); ... foo.kong(); 

创建临时变量不太可能

但更重要的是:将返回值存储在变量中可提高代码的可读性和可维护性。 例如:

 Biz nibb = getBiz(); frobnicate(nibb.foo(), nibb.bar()); galuncify(nibb.bar()); 

如果我决定使用nibb.biz()的值而不是nibb.bar() ,我必须记得在两个地方替换它。 如果我使用了变量,则不会发生此问题:

 Biz nibb = getBiz(); Bar bar = nibb.bar(); frobnicate(nibb.foo(), bar); galuncify(bar); 

还要注意方法调用如何变得更具可读性。

有许多因素,包括个人品味,方法的昂贵,方法所做的修改等。

  • 对于基本的JavaBean / map / list get方法,我通常会调用两次以实现可重复性,但这是个人品味。 同样的东西是方法
  • 对于返回值的更昂贵的操作(IE URL内容),最好存储,因为它是一个很长的操作,去网上,获取数据,并报告回来
  • 如果该方法在获取数据时修改ANYTHING,则存储该值

不幸的是,答案几乎肯定是“它取决于”。 在几乎所有时间/记忆权衡很重要的情况下,您都希望将行动建立在证据上而不是直觉上。

也就是说,使用实际数据测量程序的时间和内存配置文件。 对于相对简单的代码片段,很难找出对内联,JITing,缓存未命中等的相对影响。