何时创建局部变量,何时调用对象方法?

4

以下是一个场景。

对象A拥有一个接收对象的方法。 有2个方法。两个方法本质上都在做相同的事情。
randomCheck1()每次调用isValid()方法。
randomCheck2()只调用一次,然后每次使用本地变量。

Class A
{
    randomCheck1(myObject obj)
    {
         if (obj.getInfo().isValid())
         {
              :
         }

         // Do some more work. 
         if (obj.getInfo().isValid())
         {
              :
         }

         // Do some more work. 
         if (obj.getInfo().isValid())
         {
              :
          }

    }

    randomCheck2(myObject obj)
    {
         boolean isValidCheck = obj.getInfo().isValid();
         if (isValidCheck)
         {
              :
         }
         // Do some more work. 
         if (isValidCheck)
         {
              :
         }

         // Do some more work. 
         if (isValidCheck)
         {
              :
         }
    }
}

这两者之间有性能差异吗?
是否有编码标准规定,如果一个方法需要被调用多次,则应创建一个局部变量?


related: https://stackoverflow.com/questions/39888446/is-it-better-to-call-a-method-on-a-variable-or-chain-it-to-the-constructor - user180100
谢谢。有很多很好的反馈。我相信关键在于基础值是否可能发生变化。 - Unhandled Exception
4个回答

0

当你只有一个值需要测试时,这是一种个人喜好的问题。 如果你需要考虑多个值或者在两个或更多阶段保持一致,最好使用一个局部变量。

从性能角度来看,我猜jit可以在isValid是一个简单返回字段的情况下进行“内联”,但这次是次要的,因为与事件处理所花费的执行时间相比,这不值得真正担心。 相反,如果getInfo或isValid花费了很长时间,那就更明显应该避免不必要地调用它们。


0

在编程中,当isValid()函数每次调用时需要执行大量的工作时,随机检查2是最佳选择。


0

实际上这取决于业务场景,需要根据情况选择:

  • 如果在方法执行期间obj.getInfo().isValid()或obj.getInfo()的值会发生变化,则使用第一种方式(例如:如果在调用isValid()时每次都从数据库中获取值并且是可变的)。
  • 如果在方法执行期间obj.getInfo().isValid()的值是恒定不变的,则可以使用其中任意一种方式,尽管第二种更加易读
  • 如果考虑性能问题,则取决于isValid()方法花费的时间有多长。如果它所花费的时间非常短,则不会有任何区别。

0

你基本上有两个问题,

1)这两者之间是否存在性能差异?

答案是 - 这取决于情况。它主要取决于你的isValid()方法的复杂程度。如果你的方法需要进行一些繁重的计算来检查对象的有效性,然后给出一个结果,那么显然最好调用此方法一次,然后重复使用它。

假设你的方法需要花费1毫秒来计算有效性并返回结果,那么3次调用将需要3毫秒。但是你可以进行单次调用并重复使用该值,从而节省2毫秒。

但是,如果isValid()方法在计算方面非常简单,则两者之间没有性能差异。

2)是否有编码标准规定,如果一个方法需要被调用多次,则应创建一个局部变量?

答案是 - 这没有硬性规定,但总是更清晰的方式是调用一次该方法,获取其值并将其存储在变量中,然后随时重复使用它。

但请记住,如果isValid()方法的结果随时间变化,则需要多次调用它。假设您第一次调用它并得到true,但在1秒后再次调用它并得到false,那么在这种情况下,您不能存储该值并重复使用它,因为该值已经发生了改变。您需要多次调用它。

请告诉我是否还有其他需要了解的内容。如果这个答案对你有帮助,请考虑点赞它。 - Aritra Roy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接