我应该严格避免在 Android 上使用枚举吗?

2023-12-21

我曾经定义一组相关的常量,例如Bundle在如下界面中组合键:

public interface From{
    String LOGIN_SCREEN = "LoginSCreen";
    String NOTIFICATION = "Notification";
    String WIDGET = "widget";
}

这为我提供了一种更好的方法将相关常量组合在一起并通过静态导入(而不是实现)来使用它们。我知道Android框架也以同样的方式使用常量Toast.LENTH_LONG, View.GONE.

然而,我常常觉得,Java Enums提供更好、更强大的方式来表示常数。

但是使用起来有性能问题吗enums on Android?

经过一些研究,我最终陷入了困惑。从这个问题“在只需要整数的地方避免枚举”从 Android 性能提示中删除了? https://stackoverflow.com/questions/5143256/why-was-avoid-enums-where-you-only-need-ints-removed-from-androids-performanc很明显Google已删除“避免枚举”来自其性能提示,但来自其官方培训文档注意内存开销 http://developer.android.com/training/articles/memory.html#Overhead部分明确指出:“枚举通常需要比静态常量多两倍的内存。您应该严格避免在 Android 上使用枚举。”这仍然有效吗? (说在Java1.6以后的版本)

我观察到的另一个问题是发送enums across intents using Bundle我应该通过序列化发送它们(即putSerializable(),我认为与原始操作相比,这是一个昂贵的操作putString()方法,尽管enums免费提供)。

有人可以澄清哪一种是代表相同内容的最佳方式吗?Android?我应该严格避免使用enums on Android?


Use enum当您需要它的功能时。不要回避它strictly.

Java枚举更强大,但是如果你不需要它的功能,可以使用常量,它们占用更少的空间,并且它们本身可以是原始的。

何时使用枚举:

  • 类型检查 - 你可以接受only列出的值,并且它们不是连续的(见下面我所说的连续的 here)
  • 方法重载 - 每个枚举常量都有自己的方法实现

    public enum UnitConverter{
        METERS{
            @Override
            public double toMiles(final double meters){
                return meters * 0.00062137D;
            }
    
            @Override
            public double toMeters(final double meters){
                return meters;
            }
        },
        MILES{
            @Override
            public double toMiles(final double miles){
                return miles;
            }
    
            @Override
            public double toMeters(final double miles){
                return miles / 0.00062137D;
            }
        };
    
        public abstract double toMiles(double unit);
        public abstract double toMeters(double unit);
    }
    
  • 更多数据 - 您的一个常量包含多个无法放入一个变量中的信息

  • 复杂的数据 - 您不断需要方法来操作数据

When not使用枚举:

  • 您可以接受一种类型的所有值,并且您的常量仅包含这些最常用的
  • 你可以接受连续数据

    public class Month{
        public static final int JANUARY = 1;
        public static final int FEBRUARY = 2;
        public static final int MARCH = 3;
        ...
    
        public static String getName(final int month){
            if(month <= 0 || month > 12){
                throw new IllegalArgumentException("Invalid month number: " + month);
            }
    
            ...
        }
    }
    
  • 对于名称(如您的示例中所示)
  • 对于其他真正不需要枚举的东西

枚举占用更多空间

  • 对枚举常量的单个引用占用4 bytes
  • 每个枚举常量占用的空间是其字段大小的总和对齐到8字节+物体的顶部
  • 枚举类本身占用一些空间

常量占用更少的空间

  • 常量没有引用,因此它是纯数据(即使它是引用,那么枚举实例也将是对另一个引用的引用)
  • 常量可以添加到现有的类中 - 无需添加另一个类
  • 常量可以内联;它带来了扩展的编译时功能(例如空检查、查找死代码等)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该严格避免在 Android 上使用枚举吗? 的相关文章

  • Android NDK C++“wstring”支持

    我有用 C 编写的源代码 lib 现在我想在 Android NDK 项目 NDK 6 中编译并使用相同的源代码 lib 我能够编译大多数 C 文件 除了基于 std wstring 的功能 在 Application mk 中 当我指定时
  • 不要模拟值对象:过于通用的规则,没有解释

    以下是 Mockito 单元测试框架的引用 不要模拟值对象 为什么有人会想要这样做呢 因为实例化对象太痛苦了 gt 无效 原因 如果创造新的装置太困难 那就是一个迹象 代码可能需要一些认真的重构 另一种方法是创建 价值对象的构建者 有一些工
  • 开始使用 Honeycomb 进行 Android 开发 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何从 Google Custom Search API 获取超过 100 个结果

    我正在尝试使用 Google Custom Search API 在 Java 中进行研究 因此 我需要为每个查询提供一个大的结果集 然而 我似乎仅限于前 100 个结果 这比我需要的要少得多 我使用这样的列表方法 list setStar
  • 如何通过子 POJO 的属性过滤复合 ManyToMany POJO?

    我有两个像这样的房间实体 Entity public class Teacher implements Serializable PrimaryKey autoGenerate true public int id ColumnInfo n
  • Android - 主页按钮发出什么意图?

    我想知道设备的主页按钮到底执行什么操作 即 当您单击主页按钮时会发出什么意图 意图类别和操作 回到空白的主屏幕 我想知道在单击我自己的自定义按钮时实现此操作涉及什么 谢谢 PS我知道这不是标准的 但我的设备也不是 如果您想显示主屏幕 可以通
  • 使用Java开发跨平台,不同平台字体缩放不同

    我正在为我的大学制作一些软件 需要一个 GUI 在它的第一个版本中 我让它使用系统外观 因此它看起来像 Linux Mac Windows 中的本机应用程序 我发现这很麻烦 因为我必须根据操作系统使所有 JLabel 具有不同的大小 无论分
  • Java ConcurrentModificationException [重复]

    这个问题在这里已经有答案了 当删除倒数第二个元素时 没有 ConcurrentModificationException List
  • 为什么现在()? (客观化)

    为什么我想要异步加载 Objectify 实体 异步加载到底意味着什么 根据客观化有关加载的文档 https code google com p objectify appengine wiki BasicOperations Loadin
  • Webview 电子邮件链接 (mailto)

    我有一个视图并查看该网站有用于发送电子邮件的 malito 代码 当我打开链接时 会出现错误 我希望当我打开链接时打开 Gmail 应用程序或其他电子邮件应用程序 感谢所有帮助者 public class teacher extends A
  • 带动画的 ScrollTo(0,250) Android ScrollView

    当我滚动到 0 250 时 我想在滚动动作中包含一个动画 我做了这段代码 但它没有根据动画滚动 scrollMe 是滚动小部件 id ObjectAnimator anim ObjectAnimator ofInt scrollMe tra
  • 如何使用百分比进行android布局?

    我们如何使用百分比android视图元素的值 像这样的东西
  • 在服务器内部调用 Web 服务

    我有一个网络服务 getEmployee 当传递 id 时 它会获取单个员工的员工详细信息 同一服务器上的另一个 Web 服务 getEmployeeList 当传递一个部门时 它会获取整个员工列表 这将获取部门的 ID 然后调用 getE
  • Phonegap facebook 插件:android 的各种问题

    我正在尝试将 Phonegap 3 1 与 Phonegap facebook plugin 集成 以使我的应用程序能够使用 facebook 登录 https github com phonegap phonegap facebook p
  • 无法映射 ftl 文件中的 jsonRequest 属性

    我想在 FTL 文件中映射下面的 json 文件市场和子市场字段 但是当我尝试下面的代码时 它没有映射 有人可以帮助我吗 我从 2 天开始就无法映射它 Json请求 ProcessOrderRequest prevalidationMode
  • QML MouseArea 将事件传播到按钮

    我正在开发一个应用程序 其菜单类似于 Android 版 Gmail 收件箱应用程序菜单 基本上 当您按下按钮打开菜单时 它就会滑入视图 用户可以将其滑开或按菜单上的按钮 对于滑动我使用了代码SwipeArea from kovrov ht
  • 找不到符号assertEquals

    我正在尝试为计算器编写第一个单元测试 但 NetBeans 说它找不到该符号assertEquals和注释 Test 我应该包括一些东西吗 我正在使用 NetBeans 7 3 1 和 W7 package calculator impor
  • android 媒体播放器 - 如何禁用范围请求? (Nexus 7 上的音频流中断)

    我有一个音频流应用程序 它运行本地代理服务器 本地代理服务器与互联网流媒体源建立 http 连接 在本地获取并缓冲流数据 然后 在应用程序内部 我使用 MediaPlayer 连接到本地代理服务器 使用方法 mediaPlayer setD
  • 将带有 webapp 的 WAR 部署到 Maven 中央存储库是否有意义?

    这样做有意义吗 如果是 我在哪里可以找到使用简单的 Web Hello World 执行此操作的示例 当人们从 Maven 执行 Web 应用程序时 他们会使用 Jetty 来运行它吗 我想 tomcat 太重了 任何帮助将不胜感激 谢谢
  • 如何检测用户是否禁用 GPS(Android - Play 服务)

    我使用 gms location LocationListener Google Play 服务 来获取用户的位置 它工作正常 但我想检测用户何时禁用或启用他 她的 GPS 就像这张照片一样 当我打开 关闭位置时 不会调用任何方法 当我切换

随机推荐

  • 在 read_excel 中保留特定列

    我正在将 Excel 文件导入到 R 中 我只想保留 A 列和 C 列而不是 B 列 列按顺序为 A B C 但以下代码也保留 B 列 如何在不使用另一行代码子集的情况下删除 B 列 df lt read excel df xlsm fut
  • WPF 过滤列表框

    我有一个ListBox绑定到字符串列表 我想在输入文本时过滤列表TextBox 我该怎么做 public void ListLoad ElementList new List
  • 如何将字符串从 Haskell 传递到 C?

    我想做的就是将纯文本字符串从 Haskell 传递到 C 但是 它表示 Char 是不可接受的返回类型 我无法在任何地方找到他们认为的原因 也找不到可接受的返回类型 我正在尝试制作一个非常简单的操作系统映像 我可以使用 Qemu 启动它 有
  • 确保容量在 Java 中如何工作?

    StringBuffer buff1 new StringBuffer tuts point System out println Old Capacity of buff1 buff1 capacity buff1 ensureCapac
  • Linux 上的 Swift:迈出第一步

    我对斯威夫特完全陌生 它刚刚作为 Linux 的开源版本发布 我想尝试一下 这是在 ubuntu 14 04 上 clang 已根据先决条件安装
  • 添加过多 ID 对 html / js 渲染性能的影响

    我目前正在进行的一个项目大约有 10 个 UL 每个 UL 包含 10 50 个元素 建议每个元素都有一个指定的唯一 ID 我们将使用它通过 Javascript 更新内容 这看起来需要向页面添加大量 ID 但每个字段都会有一个真实且有意义
  • Flutter 上的简单可扩展列也不会具有“标题”>“可扩展”

    我正在尝试制作一个可扩展的列 也就是说 它有 2 个子项 子项和展开小部件时出现的子项 在下图中 您可以看到子项 蓝色 和展开的子项 红色 它们仅应在Expand gt 单击按钮 一切正常 但无论我做什么 我都无法得到Expand gt 按
  • Oracle 如果行不存在则插入

    insert ignore into table1 select value1 value2 from table2 where table2 type ok 当我运行这个时 我收到错误 缺少 INTO 关键字 当我运行这个时 我收到错误
  • HBase 表上的 SparkSQL

    任何人都直接在 HBase 表上使用 SparkSQL 就像在 Hive 表上使用 SparkSQL 一样 我是spark新手 请指导我如何连接hbase和spark 如何查询hbase表 AFAIK 有 2 种方法连接到 hbase 表
  • iOS - 使用 AVPlayer 检测 URL 流是否正常工作

    这就是我的代码中从 url 播放的样子 private func play let streamUrl let playerItem AVPlayerItem url streamURL radioPlayer AVPlayer playe
  • ls | 的输出厕所-l

    通常输出为wc l命令给出文件中的行数 但是 当我们通过管道输出ls命令它 它似乎正确显示当前工作目录中的文件和目录以及链接的数量 我的问题是输出ls命令在同一行中显示某些文件和目录的名称 那么 为什么在这种情况下使用ls wc l与相比
  • 如何使用 Powershell 更改文件的属性?

    我有一个 Powershell 脚本 可以将文件从一个位置复制到另一个位置 复制完成后 我想清除源位置中已复制的文件的存档属性 如何使用 Powershell 清除文件的 Archive 属性 您可以使用旧的 dos attrib 命令 如
  • 以编程方式更改 ABAddressBook、ABPersonCopyArrayOfAllLinkedPeople 中的链接联系人数组

    是否可以通过编程方式添加 删除 CFArray 返回的联系人ABPersonCopyArrayOfAllLinkedPeople 因此 有效地链接和取消链接来自不同来源的不同联系人记录 以在 iOs 电话簿中显示为 统一 据我所知 至少在
  • 如何在java中打开第2层原始套接字?

    如何在java中打开第2层原始套接字 在 C 中 我们通常使用 AF PACKET 级别来打开具有 sockaddr ll 结构的第 2 层原始套接字 二层编程对应的socket包是什么 使用普通的 Java 方法这是不可能的 因为 Jav
  • 使用 nuxtJS + Vue2-Editor 时如何解决文档未定义错误?

    我正在尝试使用 vue2 editor 设置 nuxtjs 应用程序 如果我尝试通过客户端导航导航到编辑器页面 则其加载但如果我直接访问或刷新 例如 com editor 页面 我收到文档未定义错误 我已经识别出它是因为 vue2 编辑器不
  • 如何交换 observableArray 中的两个项目?

    我有一个按钮 可以将 observableArray 中的项目向左移动一个位置 我正在按照以下方式进行操作 然而 缺点是categories index 被从数组中删除 从而丢弃了该节点上的任何DOM操作 在我的例子中是通过jQuery验证
  • NUnit 异步测试导致 AppDomainUnloadedException

    我有一个带有异步操作的 NET 4 5 WCF 服务 我进行了集成测试 它使用 NetNamedPipeBinding 构建服务主机并通过客户端进行操作 然而 每次这样的测试总是会导致 NUnit 报告以下内容 System AppDoma
  • 在 DBAccess 中关联两个对象

    我正在为我的 iOS 项目使用 dbaccess 如何将数组传递给 dbaccess 对象 例如 我有像这样的 dbobject interface Member DBObject property strong NSString firs
  • 如何发送带有参数的 getForObject 请求 Spring MVC

    我在服务器端有一个方法 它为我提供有关在我的数据库中注册的特定名称的信息 我正在从我的 Android 应用程序访问它 向服务器的请求正常完成 我想做的是根据我想要获取的名称将参数传递给服务器 这是我的服务器端方法 RequestMappi
  • 我应该严格避免在 Android 上使用枚举吗?

    我曾经定义一组相关的常量 例如Bundle在如下界面中组合键 public interface From String LOGIN SCREEN LoginSCreen String NOTIFICATION Notification St