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

标签 java enums coding-style

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

public enum BonusType {
  MONTHLY, YEARLY, ONE_OFF
}

只要我留在我的代码中,就可以正常工作。但是,为了相同的目的,我经常需要与使用普通 int(或 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()

int → 枚举

EnumType.values()[someInt]

字符串 → 枚举

EnumType.valueOf(yourString)

枚举 → 字符串

yourEnum.name()

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

关于java - 方便地在 enum 和 int/String 之间映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5021246/

相关文章:

java - 在同一线程中使用(强制)与同一数据库的第二个 JDBC 连接

java - 等待驱动程序直到元素消失

java - 在android应用程序中实现时间延迟

Java Enum 作为 Enum 中的泛型类型

私有(private)成员变量的 C# 编码标准

python - 为什么 pep8 建议在评论中使用两个空格?

java - 尝试打开一个简单的 JSP 文件会产生 HTTP Status 500

swift - 隐式展开的可选枚举投诉

c++ - static_casting一个int而不是直接对其进行初始化有什么好处吗?

PHP编码规范