有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java通过使用特定于枚举的int来设置枚举?

大家好。所以我有一组枚举和一个db,其中的整数对应于这些枚举。举个例子:

public static enum Day {
    SUNDAY(1), MONDAY(2), TUESDAY(3), WEDNESDAY(4), THURSDAY(5), FRIDAY(6), SATURDAY(7);

    public final int fId;

    private Day(int id) {
        this.fId = id;
    }
}

我还有一个数据库,它只通过整数引用这些天,整数对应于上面枚举集中的整数。我要做的是查询一个数据库,它将返回一个整数,然后根据从数据库返回的整数将枚举数设置为一个对象。我可以这样做:

public static Day getDay(int i) {
    switch(i) {
    case 1:
        return Day.SUNDAY;
    case 2: 
        return Day.MONDAY;
    //And so on
    }
}

但是对于一个包含超过100个枚举的枚举集来说,这似乎不太实际

有没有办法做到这一点?同样,我的目标是简单地插入一个int值并返回一个枚举数,而不必为这个集合中的许多枚举创建一个新方法。也许我应该让它成为自己的类,而不是一个枚举器,但我希望这样做。谢谢


共 (2) 个答案

  1. # 1 楼答案

    枚举有一个内置的ID号,即“序数”,可以用于此目的,只要您有一种简单的方法从数据库中表示给定值的数字到枚举的序数。序数按照在源文件中声明的顺序分配给枚举值,从0开始,因此在您的示例中,SUNDAY的序数为0,MONDAY的序数为1,等等

    为了使用它,您只需将存储在数据库中的整数转换为相应的序号,然后使用它来access the enum value。因此,对于您的示例,一个实现可能是

    private static Day[] values = Day.values();
    public static Day getDay(int i) {
        return values[i - 1];
    }
    

    如果枚举值根据其数据库ID的顺序与它们在源代码中声明的顺序相同,那么您几乎可以按原样使用上述方法(除了更改类名)。否则,您可能需要做一些更复杂的事情来将数据库值映射到序号;如果映射是高度非线性的,也许可以设置一个数组

    当然,如果你这么做,fId字段就没有用了

  2. # 2 楼答案

    一天。values()将返回枚举值的(基于零的)数组