java模式:什么时候使用临时变量是有意义的

Gra*_*ray 13 java design-patterns

所以我发现自己经常做类似下面的模式.代替:

if (map.containsKey(someKey)) {
    Value someValue = map.get(someKey);
    ...
}
Run Code Online (Sandbox Code Playgroud)

为了不遍历地图两次(因为我知道我的地图不存储空值),我会这样做:

Value someValue = map.get(someKey);
if (someValue != null) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

在我看来,这似乎是一个有价值的模式,因为Map操作执行了大量的操作,而我认为优化器不够智能,无法优化它.

但后来我发现自己在其他情况下也会做类似的模式.例如,我应该将someMethod()结果存储在临时变量中而不是两次调用吗?显然someMethod(),如果有副作用,我不能再调用两次但是从优化的角度来看它只调用一次是否有意义?

if (someObject.someMethod() != null) {
    processSomehow(someObject.someMethod());
}
Run Code Online (Sandbox Code Playgroud)

我知道这与"非建设性"问题接壤,因此我正在寻找能够提供一些事实和参考的答案,而不仅仅是猜想.

  • 这样做什么时候才有意义?什么时候不这样做?
  • 我应该如何评估someMethod()确定何时应使用临时变量的"成本" ?
  • 对于诸如get方法之类的简单方法,这可能会妨碍热点编译器或优化器,并实际产生效率较低的代码吗?

对于子孙后代,我不是在问"我怎样才能提高现有程序的速度".我试图找出"当我编写未来代码时我应该使用什么模式".

感谢您提供任何信息.

And*_*s_D 11

我应该如何评估someMethod()的"成本"来确定何时应该使用临时变量?

简单看一下执行情况someMethod().如果它只返回一个字段 - 就像通常的getter方法那样,就没有必要声明一个局部变量(性能明智).如果方法创建对象,调用数据库或读取文件内容,则通常明智地缓存返回值.

就个人而言,我并不关心因宣布临时变量而导致的性能问题.我只保留返回值而不是两次调用方法.代码更容易阅读和理解(除非你只是命名所有这些变量temp;-))

  • 我的门槛非常低.所有东西都更贵,然后`返回mValue;`将被缓存;) - 顺便说一句,我相信,我们只需查看代码即可估算出复杂性/成本. (2认同)

Fre*_*Foo 5

显然,如果有副作用,我不能两次调用someMethod()但是从优化的角度来看它只调用一次才有意义吗?

当你使用分析器证明它很重要时.但是习惯连续两次不调用方法,因为它会使维护变得更容易(如果检查发生变化,你忘了在两个地方都改变它?).大量使用临时变量,它们非常便宜.

  • 我认为"自由"可能需要合格.使用一次性变量乱丢你的方法也有其缺点. (2认同)

Fab*_*ney 5

作为一般规则,我需要多次使用本地var.你可以给那个本地var一个漂亮的名字,每个人都知道这个var是什么.从性能的角度来看:本地变量很便宜,方法也许很复杂.

特别是当someMethod()像同步方法一样昂贵时,这应该会更好.但是什么时候someMethod()是同步方法,那么它应该被多个线程并发调用,然后调用方法两次或者存储它的返回值并重用它会有所不同......

...另一点需要提及的是,后续方法调用不必返回相同的数据.因此,带/不带局部变量的示例并不总是有效替代后续方法调用.但我认为你已经考虑过了.