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

2023-11-27

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

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 object?


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

内存占用

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

表现

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

可读性

跟着DRY原则。在您的情况下,这并不重要,因为局部变量名称是按字符排列的,与方法调用一样长,但对于更复杂的事情,它是可读的,因为您不必这样做找出10个不同点两个表达式之间。如果您知道它们是相同的,请使用局部变量来明确说明。

正确性

想象一下你的SelectItem不接受nulls 并且您的程序是多线程的。的价值listType.getDescription()在此期间可以改变,你就干杯了。

调试

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


省略局部变量的唯一好处是节省一行。所以我只会在确实不重要的情况下才这样做:

  • 非常简短的表达
  • 不可能并发修改
  • 简单的私有最终吸气剂
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在对象上调用 getter 与将其存储为局部变量(内存占用、性能) 的相关文章

  • 使用 Tabula 通过 Python 读取 pdf 时出现 Java 错误

    我已经安装了 tabula 库 用于使用 python 将 pdf 读取到 pandas 数据框中 但是当我运行代码时 import tabula df tabula read pdf sample1 pdf pages 1 我得到了例外
  • 如何在java中将数组值排序为循环格式?

    我的数组值如下 String value 1 2 3 4 5 6 7 8 9 10 假设如果我将值 5 传递给 tat 数组 它应该按如下顺序排序 5 6 7 8 9 10 1 2 3 4 怎么办 有人帮忙吗 感谢你 你需要的就是所谓的轮换
  • 垃圾收集器如何在幕后工作来收集死对象?

    我正在阅读有关垃圾收集的内容 众所周知 垃圾收集会收集死亡对象并回收内存 我的问题是 Collector 如何知道任何对象已死亡 它使用什么数据结构来跟踪活动对象 我正在研究这个问题 我发现GC实际上会跟踪活动对象 并标记它们 每个未标记的
  • eclipse行号状态行贡献项是如何实现的?

    我需要更新状态行编辑器特定的信息 我已经有了自己的实现 但我想看看 eclipse 贡献项是如何实现的 它显示状态行中的行号 列位置 谁能指点一下 哪里可以找到源代码 提前致谢 亚历克斯 G 我一直在研究它 它非常复杂 我不确定我是否了解完
  • Jframe 内有 2 个 Jdialogs 的 setModal 问题

    当我设置第一个选项时 我遇到了问题JDialog模态 第二个非模态 这是我正在尝试实现的功能 单击 测试对话框 按钮 一个JDialog有名字自定义对话框 主要的将会打开 如果单击 是 选项自定义对话框主 其他JDialog named 自
  • Java 中如何将 char 转换为 int? [复制]

    这个问题在这里已经有答案了 我是Java编程新手 我有例如 char x 9 我需要得到撇号中的数字 即数字 9 本身 我尝试执行以下操作 char x 9 int y int x 但没有成功 那么我应该怎么做才能得到撇号中的数字呢 ASC
  • Android 无法解析日期异常

    当尝试解析发送到我的 Android 客户端的日期字符串时 我得到一个无法解析的日期 这是例外 java text ParseException 无法解析的日期 2018 09 18T00 00 00Z 位于 偏移量 19 在 java t
  • 如何在java中将日期格式从YYMMDD更改为YYYY-MM-DD? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我从机器可读代码中获取日期格式为 YYMMDD 如何将其更改为 YYYY MM DD 例如我收到 871223 YYMMDD 我想把它改成
  • 如何仅从 Firestore 获取最新更新的数据?

    在 Firestore 上发现任何更改时始终获取整个文档 如何只获取最近更新的数据 这是我的数据 我需要在第一次加载时在聊天中按对象顺序 例如 2018 09 17 30 40 msg和sendby 并且如果数据更新则仅获取新的msg和se
  • 提高 PostgreSQL 1 亿数据左连接查询性能

    我在用Postgresql 9 2 version Windows 7 64 bit RAM 6GB 这是一个Java企业项目 我必须在我的页面中显示订单相关信息 有三个表通过左连接连接在一起 Tables TV HD 389772 行 T
  • 在Java中运行bat文件并等待

    您可能会认为从 Java 启动 bat 文件是一项简单的任务 但事实并非如此 我有一个 bat 文件 它对从文本文件读取的值循环执行一些 sql 命令 它或多或少是这样的 FOR F x in CD listOfThings txt do
  • 如何区分从 Saxon XPathSelector 返回的属性节点和元素节点

    给定 XML
  • 为什么\0在java中不同系统中打印不同的输出

    下面的代码在不同的系统中打印不同的输出 String s hello vsrd replace 0 System out println s 当我在我的系统中尝试时 Linux Ubuntu Netbeans 7 1 它打印 When I
  • 使用 HtmlUnit 定位弹出窗口

    我正在构建一个登录网站并抓取一些数据的程序 登录表单是一个弹出窗口 所以我需要访问这个www betexplorer com网站 在页面的右上角有一个登录链接 写着 登录 我单击该链接 然后出现登录弹出表单 我能够找到顶部的登录链接 但找不
  • Android S8+ 警告消息“不支持当前的显示尺寸设置,可能会出现意外行为”

    我在 Samsung S8 Android 7 中收到此警告消息 APP NAME 不支持当前的显示尺寸设置 可能会 行为出乎意料 它意味着什么以及如何删除它 谢谢 通过添加解决supports screens 机器人 xlargeScre
  • 列表过滤器内的 Java 8 lambda 列表

    示例 JSON id 1 products id 333 status Active id 222 status Inactive id 111 status Active id 2 products id 6 status Active
  • 在java中以原子方式获取多个锁

    我有以下代码 注意 为了可读性 我尽可能简化了代码 如果我忘记了任何关键部分 请告诉我 public class User private Relations relations public User relations new Rela
  • java XMLSerializer 避免复杂的空元素

    我有这个代码 DocumentBuilderFactory factory DocumentBuilderFactory newInstance DocumentBuilder builder factory newDocumentBuil
  • iPhone 3GS 上的 ARM 与 Thumb 性能比较,非浮点代码

    我想知道是否有人有关于 iPhone 3GS 上 ARM 与 Thumb 代码性能的硬性数据 特别是对于非浮点 VFP 或 NEON 代码 我知道 Thumb 模式下的浮点性能问题 更大的 ARM 指令的额外代码大小是否会在某个时刻成为性能
  • Spring RESTful控制器方法改进建议

    我是 Spring REST 和 Hibernate 的新手 也就是说 我尝试组合一个企业级控制器方法 我计划将其用作未来开发的模式 您认为可以通过哪些方法来改进 我确信有很多 RequestMapping value user metho

随机推荐

  • 我应该存储整个对象,还是容器中对象的指针?

    从头开始设计一个新系统 我将使用 STL 来存储某些长期存在的对象的列表和映射 问题 我应该确保我的对象具有复制构造函数并将对象的副本存储在我的 STL 容器中 还是自己管理生命周期和范围并仅将指向这些对象的指针存储在我的 STL 容器中通
  • PHP 的特殊行为 (5.3)、静态继承和引用

    我正在 PHP 5 3 中编写一个库 其中大部分是一个具有多个静态属性的类 这些静态属性由子类扩展以允许子类的零配置 无论如何 这里有一个示例来说明我发现的特殊性
  • IE 中 jQuery ajax 调用出现“无传输”错误

    我需要使用 foursquare API 来搜索场地 当然是跨域的 它在 Firefox 中没有任何问题 但在 Internet Explorer 中 我测试过 7 8 9 我的 JavaScript 代码如下所示 searchVenues
  • 如何将android源代码(AOSP)导入到Android studio中?

    我知道如何将android源代码导入到eclipse中 但是有什么方法可以将android源代码导入到android studio中 因为我想把我的IDE从eclipse换成android studio 我知道这个问题已经得到了回答 但我想
  • 将 StringBuilder 传递给需要 char 指针的 DLL 函数

    我正在尝试与 Delphi 中创建的 DLL 库进行交互 在 C 中 我完美地完成了这个调用 for int y 1 y lt 12 y char chanName char malloc 21 memset chanName 0 21 c
  • 计算数据框中成对有效观察值(无 NA)的数量

    假设我有一个像这样的数据框 Df lt data frame V1 c 1 2 3 NA 5 V2 c 1 2 NA 4 5 V3 c NA 2 NA 4 NA 现在我想计算两个变量的每个组合的有效观察数 为此 我写了一个函数sharedc
  • Android 4.4.2 中 DialogFragment 顶部有蓝线

    我的对话框片段顶部出现一条蓝线 我无法摆脱它 我什至不知道为什么它首先出现 有人知道如何摆脱它吗 我已经在多个设备上进行了测试 并且在更高版本的 Android 上运行得很好 My code private void setupDialog
  • Pandas 合并意外产生后缀

    我正在将两个 Pandas DataFrame 合并在一起 并获得 x 和 y 后缀 易于复制下面的示例 我尝试添加 suffixes False False 进入合并 但它返回一个错误 ValueError columns overlap
  • 通过 iframe 脚本加载器避免全局变量污染?

    问题 存在需要包含在网页上的编码不良的脚本 这些脚本通过执行以下操作来污染全局范围 为未声明的标识符赋值 向内置构造函数添加属性 例如Object and Array 及其原型 其他讨厌的东西 解决方案 我想包含脚本而不产生不利的副作用 我
  • C++ 中的 throw 后会调用析构函数吗?

    我运行了一个示例程序 确实调用了堆栈分配对象的析构函数 但这是否由标准保证 是的 这是有保证的 只要捕获到异常 直到命令其中调用析构函数 C 11 15 2 构造函数和析构函数 except ctor 1 当控制权从 throw 表达式传递
  • Stargazer 中的 p 值不精确

    我希望观星者的回归输出中的星星与 正常输出 中的星星相同 我产生数据 library stargazer library lmtest library sandwich set seed 1234 df lt data frame y 10
  • Visual Studio 在调试时锁定文件

    我有一个包含多个项目的 VS 解决方案 在调试特定项目时 VS 会锁定所有源文件 我想解锁调试者不依赖的源 有没有办法在一个解决方案中做到这一点 UPDATE 我使用的是 Win XP SP3 32 位 Visual Studio 2010
  • 为什么 $hash.key 语法在 ExpandString 方法中不起作用?

    以下 Powershell 脚本演示了该问题 hash a 1 b 2 Write Host hash a gt 1 Write Host hash a gt 1 Two ways of printing using quoted stri
  • 在打字稿函数中声明“this”的类型?

    我正在写一个繁重任务在打字稿中 我正在尝试翻译 JavaScript 中已有的内容 因此 当 grunt 运行一个任务时 它会运行一个函数 当它运行时 grunt 设置this具有有用属性的对象 与 jQuery 重载的方式相同this与您
  • 在分配控制台之前调用 Console.WriteLine

    我最近在我的应用程序中遇到了以下问题 它没有显示任何控制台输出 尽管控制台已通过使用分配AllocConsole 我很快就发现这是由于尝试 隐藏在代码中 在执行之前写入控制台而引起的 AllocConsole被称为 所以它看起来像这样 Co
  • 如何开发人脸识别iPhone应用程序? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我正在尝试开发一款用于人脸识别 检测的 iPhone 在我的应用程序中 我想让我的 iP
  • 快速按下 Xcode 按钮时快速播放声音的最佳方法是什么?

    我有一个音板 它只是一个带有大约 8 个按钮的屏幕 每个单独的按钮都有自己的声音 按下按钮时会播放该声音 我可以通过多种方式播放声音 例如使用 SystemSound 或 AVAudioPlayer 到目前为止 系统声音似乎具有最快的响应时
  • MPI:阻塞与非阻塞

    我无法理解 MPI 中阻塞通信和非阻塞通信的概念 两者有何区别 有什么优点和缺点 阻止通信是使用完成的MPI Send and MPI Recv 在通信完成之前 这些函数不会返回 即 它们会阻塞 稍微简化一下 这意味着缓冲区传递给MPI S
  • 免受自由的保护

    刚刚在我们的应用程序上尝试了 Freedom 应用程序 我可以用它购买所有应用程序内购买项目 至少在运行 Play Store 3 x 时是这样 如果我将 Play 商店升级到 4 x 那么 Freedom hack 就会停止工作 无论如何
  • 在对象上调用 getter 与将其存储为局部变量(内存占用、性能)

    在下面的代码中我们进行调用listType getDescription twice for ListType listType this listTypeManager getSelectableListTypes if listType