Java方法vrs引用性能

时间:2014-10-31 19:28:11

标签: java methods reference

由于我认为调用方法的性能成本高于仅调用一次并保留引用的性能成本,因此我倾向于尽可能少地调用方法。问题是我认为我在大学时从C ++那里得到了这个观点,从那时起事情发生了很大的变化。

哪个更便宜?

something.getOrDoSomething();
something.getOrDoSomething();

Thing thing1 = something.getOrDoSomething();
//use thing1 from now on.

现在我知道一个方法可能包含任何内容,所以我们假设它们没有。它们只是简单的吸气剂。我应该注意JVM性能优化吗?

我想清楚这一点,因为我在遗留代码中已经看到了很多。

1 个答案:

答案 0 :(得分:5)

因为你问的是性能:它。不。物质

JVM中的JIT将在运行时优化字节码,这些选项的执行速度甚至会超出您的想象。不要担心这种微观优化,除非它已经证明这是你的应用程序的瓶颈,并通过使用像分析器这样的工具来证明。

来自你的评论:

  

如果开发人员习惯于这种方式进行编码,他们最终可能不会重复调用一种方法而不仅仅是获取更多内容吗?

此处您关心的不仅仅是表现。这里的答案是:对于所使用的代码部分或代码可读性而言,这是一个有用的问题:

  • 如果您通过一段代码对此getter进行的调用非常少,并且用于小目的,那么请使用getter。
  • 如果您需要在一段代码中多次访问此字段,并且需要通过对此引用所做的更改进行调试,则必须先将其存储在变量中,然后再使用它。

要考虑的另一个因素是Law of Demeter

  
      
  • 每个单位对其他单位的知识应该有限:只有与当前单位“密切”相关的单位。
  •   
  • 每个单位只应与其朋友交谈;不要和陌生人说话。
  •   
  • 只与您的直接朋友交谈。
  •   

例如,这是一段代码:

public void someMethod(Foo foo) {
    logger.info(foo.getBar().getFirstName());
    logger.info(foo.getBar().getLastName());
    logger.info(foo.getBar().getBirthday());
    logger.info(foo.getBar().getBaz().getSomefield());
    //and probably more other operations not directly involved with logger.info...
}

应该改写为:

public void someMethod(Foo foo) {
    Bar bar = foo.getBar();
    logger.info(bar.getFirstName());
    logger.info(bar.getLastName());
    logger.info(bar.getBirthday());
    Baz baz = bar.getBaz();
    logger.info(baz.getSomefield());
    //and on...
}