gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:06:01 26 4
gpt4 key购买 nike

在下面的代码中,我们调用 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 对象?

最佳答案

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

内存占用

单个局部变量需要 4 或 8 个字节。这是一个引用,没有递归,所以我们忽略它。

性能

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

可读性

关注DRY原则。在您的情况下,这几乎无关紧要,因为局部变量名称与方法调用一样长,但对于更复杂的情况,它是可读性的,因为您不必 find the 10 differences两个表达式之间。如果您知道它们是相同的,那么请使用局部变量来明确。

正确性

假设您的 SelectItem 不接受 null 并且您的程序是多线程的。 listType.getDescription() 的值可能会在此期间发生变化,而你已经被烤熟了。

调试

拥有一个包含有趣值的局部变量是一个优势。


省略局部变量的唯一方法是节省一行。所以我只会在真正无关紧要的情况下这样做:

  • 非常简短的表达
  • 不可能同时进行修改
  • 简单的私有(private)最终 getter

关于java - 在对象上调用 getter 与将其存储为局部变量(内存占用、性能),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19445737/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com