方便地在 enum 和 int / String 之间映射

2023-12-10

当使用只能取有限数量值的变量/参数时,我尝试始终使用 Java 的enum, as in

public enum BonusType {
  MONTHLY, YEARLY, ONE_OFF
}

只要我留在我的代码中,就可以正常工作。但是,我经常需要与使用普通代码的其他代码进行交互int (or String) 值用于相同目的,或者我需要从数据存储为数字或字符串的数据库中读取/写入。

在这种情况下,我希望有一种方便的方法将每个枚举值与一个整数关联起来,这样我就可以转换两种方式(换句话说,我需要一个“可逆枚举”)。

从 enum 到 int 很容易:

public enum BonusType {
  public final int id;

  BonusType(int id) {
    this.id = id;
  }
  MONTHLY(1), YEARLY(2), ONE_OFF(3);
}

然后我可以访问 int 值BonusType x = MONTHLY; int id = x.id;.

然而,我看不出有什么好的相反的方法,即从 int 到 enum。理想情况下,类似

BonusType bt = BonusType.getById(2); 

我能想到的唯一解决方案是:

  • 将查找方法放入枚举中,该方法使用BonusType.values()填充映射“int -> enum”,然后缓存该映射并将其用于查找。可以,但我必须将此方法完全相同地复制到我使用的每个枚举中:-(。
  • 将查找方法放入静态实用程序类中。然后我只需要一种“查找”方法,但我必须摆弄反射才能使其适用于任意枚举。

对于这样一个简单的(?)问题,这两种方法似乎都非常尴尬。

还有其他想法/见解吗?


枚举 → 整数

yourEnum.ordinal()

整数 → 枚举

EnumType.values()[someInt]

字符串 → 枚举

EnumType.valueOf(yourString)

枚举 → 字符串

yourEnum.name()

旁注:
正如您正确指出的那样,ordinal()不同版本可能“不稳定”。这就是为什么我总是将常量作为字符串存储在数据库中的确切原因。 (实际上,当使用MySql时,我将它们存储为MySql 枚举!)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

方便地在 enum 和 int / String 之间映射 的相关文章

随机推荐

  • 在 ActiveResource 中设置站点/用户字段

    我正在构建一个 sinatra 应用程序 它将使用 Highrise CRM gem 访问 Highrise 数据 这个 gem 基于 ActiveResource 类 我想为每个请求设置站点 用户字段 我遵循了这里发布的建议 基于每个用户
  • 如何抑制 Maven“无法找到资源”消息?

    我如何告诉 Maven 对于无法找到依赖项的存储库抑制 无法找到资源 信息消息 但显示那些它确实找到依赖项的存储库 也就是说 显示命中 但忽略未命中 因为它们淹没并掩盖了命中 例如 代替此输出 Downloading http downlo
  • 为什么了解 Asp.net 生命周期对于 Asp.net 编码很重要?

    为什么了解 Asp net 生命周期对于 Asp net 编码很重要 因为否则 您最终会对代码做出错误的假设 在不了解平台如何工作的情况下为平台进行开发绝不是一个好主意 至少 allASP Net 开发人员必须了解客户端代码 Javascr
  • android 在任何应用程序顶部显示带有弹出窗口的通知

    使用下面的代码 我的通知仅添加到通知栏 不会显示弹出式消息 就像您在另一个应用程序中收到 Whatsapp 消息一样 是什么导致通知发生这种情况 private void sendNotification int distance View
  • 一段时间后失去与 MySQL 的连接,并且没有重新连接

    我正在开发一个独立的服务器 它使用 JPA Hibernate 来访问 MySQL 数据库 当我启动服务器时 一切正常 然而 一段时间后 通常是第二天早上 如果我下午启动它 它将停止工作 因为显然与 MySQL 的连接已关闭 我看到很多So
  • 谷歌静态地图通过倾斜获得卫星视图

    在文档中没有看到任何内容 所以我想我会在这里问 对于通过谷歌静态地图 API 捕获图像 有什么方法可以获得倾斜的视图吗 似乎没有任何关于如何查询此内容的文档 Thanks 我做了一个小例子 可以帮助你 它使用 html2canvas js
  • 似乎 JavaMail 的 MimeBodyPart.setFileName 在电子邮件中插入换行符并导致文件名显示为无效

    我们有代码可以发送到一个人的邮箱并将带有附件的电子邮件复制到文件系统 用于复制消息和附件的代码对于大多数文件都可以正常工作 但长文件名会出现问题 if attachment instanceof FileAttachment attachm
  • PHP/Apache 拒绝用户访问文件夹,但不拒绝脚本访问

    所以我有这个 php Web 应用程序 并且我的文件夹之一包含一些可以下载的文件 我有一个修改标题的下载脚本 以便始终提供下载链接 例如 当您单击链接时 会弹出一个下载框 而不是显示图片 现在 如果您输入如下网址 http www mywe
  • MongoDB - 如何查询集合中的嵌套项目?

    我有一些数据看起来像这样 id ObjectId 4e2f2af16f1e7e4c2000000a advertisers created at ISODate 2011 07 26T21 02 19Z category Infinity
  • 用于休眠的 JPA @ManyToOne

    老派的休眠 ManyToOne 很懒 JPA ManyToOne 很渴望 感谢上帝 在这两个 OneToMany 中都很懒 休眠中是否有一个设置可以覆盖这个非常糟糕的设置 有太多人不断添加 ManyToOnes 而不将其设置为惰性 即他们忘
  • nunit-console 可以列出测试装置中的所有测试名称吗?

    我想在运行之前报告它们 并且可以选择通过 shell 脚本运行单独的测试 而无需管理类别 我们有一些非托管代码 可能会使进程处于不良状态 有时很乐意在每个 nunit console 运行中单独运行每个测试 现在有 explore命令行选项
  • 如何确定事件是否已被订阅

    在我的 NET 应用程序中 我订阅了另一个类的事件 认购是有条件的 当控件可见时我订阅事件 当控件不可见时取消订阅它 但是 在某些情况下 即使控件不可见 我也不想取消订阅该事件 因为我想要后台线程上发生的操作的结果 有没有办法可以确定一个类
  • 从 VB.net 2008 开始 ASP.NET MVC

    在哪里可以找到有关使用 VB net 2008 作为语言学习 ASP NET MVC 的优秀教程 我在网上搜索到的大多数深入教程都是用 C 编写的 您是否尝试过在搜索中添加 VB 一词 http www myvbprof com 2007
  • 如何安装“帽子”

    我正在尝试获取Hat调试器 当我尝试时 cabal install hat OR cabal install hat v 最后我得到 configure error in tmp terminfo 0 4 0 0 17745 terminf
  • 验证 ListBoxItem 而不是 ListBox

    我有一个 ListBox 绑定到实现 IDataErrorInfo 的对象列表 我已将 ListBox 上的 ValidatesOnDataErrors 属性设置为 True 如果我选择无效的项目 列表框周围会出现红色边框 如何修改 Ite
  • 如何使用 .po 文件翻译帖子或页面的 WordPress 内容 [关闭]

    Closed 这个问题需要调试细节 目前不接受答案 对于 Wordpress WooCommerce 我想找到一个插件来翻译帖子 页面 自定义帖子类型的内容 例如基于 po 文件 而不是 WPML 因为很多段落需要重用它 我可以用什么来达到
  • Newtonsoft.json IsoDateTimeConverter 和 DateFormatHandling

    这不是一个问题 而是一个概念 我只是想把它说清楚 当使用 asp net web api 时 我们使用 Newtonsoft Json 的序列化器设置 在这个设置中我们可以设置 jsonSetting Converters Add new
  • MATLAB:如何求解模 m 的线性系统

    有谁知道当方程实际上同余 mod 时 哪些函数可用于求解线性系统m 愿望是求解一个线性系统 Ax b 对于 x 值 其中 Ax 与 b 一致 关于这种情况下如何进行高斯消去的讨论可以在这里找到 但我希望使用 MATLAB 而不是尝试手动完成
  • 通过 GMail API 从我的 Javascript 应用程序发送电子邮件 - 邮件显示在 GMail 发送列表中,但未发送到目标电子邮件地址

    我一直在编写一个客户端 Chrome 浏览器 应用程序 通过 REST API 与 GMail 集成 我的应用程序是用 Javascript Angular 编写的 大部分 GMail 集成工作正常 它可以从 GMail 获取 电子邮件 个
  • 方便地在 enum 和 int / String 之间映射

    当使用只能取有限数量值的变量 参数时 我尝试始终使用 Java 的enum as in public enum BonusType MONTHLY YEARLY ONE OFF 只要我留在我的代码中 就可以正常工作 但是 我经常需要与使用普