【问题标题】:Someone told me that it is saving memory to use numbers directly instead of static final int fields, is that true?有人告诉我直接使用数字而不是静态最终 int 字段可以节省内存,这是真的吗?
【发布时间】:2012-05-09 08:07:50
【问题描述】:

在我的 Android 项目中,有许多 constances 来表示捆绑额外键、处理程序的消息参数、对话框 id ant 等。 我的团队中有人使用一些正常的数字来执行此操作,例如:

handler.sendMessage(handler.obtainMessage(MESSAGE_OK, 1, 0));
handler.sendMessage(handler.obtainMessage(MESSAGE_OK, 2, 0));
handler.sendMessage(handler.obtainMessage(MESSAGE_OK, 3, 0));

在处理程序中:

switch (msg.arg1) {
case 1:
    break;
case 2:
    break;
case 3:
    break;
}

他说太多的静态最终常量会消耗大量内存。但我认为他的解决方案使代码难以阅读和重构。

我已阅读此问题并在 Google 上搜索了很多,但未能找到答案。 java: is using a final static int = 1 better than just a normal 1?

我希望有人可以告诉我静态决赛的内存成本。

对不起,我的英语不好。

【问题讨论】:

标签: java android memory-management constants magic-numbers


【解决方案1】:

您不必费心将其更改为文字,这会使您的代码可读性和可维护性降低。

从长远来看,你将受益于这种“失忆”

【讨论】:

    【解决方案2】:

    从技术上讲,他是对的 - 静态 int 字段确实会消耗一些额外的内存。

    但是,成本可以忽略不计。它是一个 int,加上反射支持的相关元数据。使用有意义的名称的好处可以使您的代码更具可读性,并确保该数字的语义是众所周知的并且无论在哪里使用都是一致的,显然超过了成本。

    你可以做一个简单的测试。编写一个小应用程序,用不同的数字文字调用 handler.sendMessage 1000 次,构建它并记下 .dex 文件的大小。然后用 1000 个静态 int 常量替换 1000 个文字,并执行相同操作。比较这两种大小,您将了解您的应用程序需要的额外内存的数量级。 (为了完整起见,请在此处发布数字作为评论:-))

    【讨论】:

    • 感谢您的回答,我会尽力说服我的队友。顺便说一句,这个测试是一个很好的展示差异的测试,我稍后会这样做并在这里更新以确保完整性:)
    【解决方案3】:

    它节省了非常少的内存 - 基本上只是在相关类中记录额外常量并从其他类引用它所需的额外元数据。

    不值得担心这个,除非你的内存非常有限。

    从长远来看,使用命名良好的静态最终常量而不是神秘的幻数会更好地提高代码的可维护性和健全性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      • 2020-02-21
      相关资源
      最近更新 更多