有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java方法vrs参考性能

我更喜欢尽可能少地调用一个方法,因为我认为调用一个方法的性能代价大于只调用一次并保留一个引用的性能代价。问题是,我认为我从C++中得到了这个观点,从那时起,事情发生了很大的变化。p>

那么哪个更便宜呢

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

或者

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

现在我知道一个方法可能包含任何东西,所以让我们假设它们不包含任何东西。它们只是简单的getter。我是否应该注意JVM性能优化

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


共 (1) 个答案

  1. # 1 楼答案

    既然你在问性能:它。没关系

    JVM中的JIT将在运行时优化字节码,这些选项的执行速度将比您想象的还要快。不要担心这种微优化,除非已经证明这是应用程序中的一个瓶颈,并通过使用探查器之类的工具加以证明

    根据您的评论:

    if developers get used to coding this way might not they eventually make repetitive calls to a method that does something more than just getting?

    在这里,你关心的不仅仅是性能。这里的答案是:对于正在使用的代码部分或代码可读性来说,这是一个有用的问题:

    • 如果您通过一段代码对这个getter进行了很少的调用,而且是出于小目的,那么就使用getter
    • 如果您需要在一段代码中多次访问此字段,并且需要通过对此引用所做的更改进行调试,那么您肯定会先将其存储在变量中,然后再使用它

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

    • Each unit should have only limited knowledge about other units: only units "closely" related to the current unit.
    • Each unit should only talk to its friends; don't talk to strangers.
    • Only talk to your immediate friends.

    例如,这是一段如下代码:

    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...
    }