在对象上调用 getters 与将其存储为局部变量(内存占用、性能)

在下面的代码中,我们进行两次调用:listType.getDescription()

for (ListType listType: this.listTypeManager.getSelectableListTypes())
{
    if (listType.getDescription() != null)
    {
        children.add(new SelectItem( listType.getId() , listType.getDescription()));
    }
}

我倾向于重构代码以使用单个变量:

for (ListType listType: this.listTypeManager.getSelectableListTypes())
{
    String description = listType.getDescription();

    if (description != null)
    {
        children.add(new SelectItem(listType.getId() ,description));
    }
}

我的理解是,JVM以某种方式针对原始代码进行了优化,尤其是像.children.add(new SelectItem(listType.getId(), listType.getDescription()));

比较这两个选项,哪一个是首选方法,为什么?这是在内存占用,性能,可读性/易用性以及我现在没有想到的其他方面。

后者的代码片段何时变得比前者更有利,也就是说,当使用临时局部变量变得更加理想时,是否有任何(近似)调用次数,因为总是需要一些堆栈操作来存储对象?listType.getDescription()listType.getDescription()this


答案 1

我几乎总是更喜欢局部变量解决方案。

内存占用

单个局部变量的开销为 4 或 8 个字节。它是一个引用,没有递归,所以让我们忽略它。

性能

如果这是一个简单的 getter,JVM 可以自己记住它,所以没有区别。如果这是一个无法优化的昂贵调用,手动记忆可以使其更快。

可读性

遵循 DRY 原则。在你的例子中,这并不重要,因为局部变量名称与方法调用一样长,但对于任何更复杂的东西,它都是可读性的,因为你不必找到两个表达式之间的10个区别。如果您知道它们是相同的,那么请使用局部变量将其明确。

正确性

想象一下,你不接受s,你的程序是多线程的。与此同时,的价值可能会发生变化,您会被祝酒。SelectItemnulllistType.getDescription()

调试

具有包含有趣值的局部变量是一个优点。


通过省略局部变量来获胜的唯一方法是保存一行。因此,我只会在真正无关紧要的情况下这样做:

  • 非常短的表达式
  • 没有可能的并发修改
  • 简单的私人最终获取器

答案 2

我认为第二种方式肯定更好,因为它提高了代码的可读性和可维护性,这是这里最重要的事情。这种微优化不会真正帮助你,除非你编写一个每毫秒都很重要的应用程序。


推荐