2011-06-02 79 views
14

嘿,所有。所以我有一組枚舉和與這些枚舉相對應的整數。像這樣的事情,例如:使用特定於該枚舉的int設置枚舉?

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; 
    } 
} 

我也有一個數據庫,其中僅整數,這符合其INT在上面設置的枚舉是指這些天。我期望做的是查詢一個數據庫,它將返回一個整數,然後將枚舉數設置爲基於從數據庫返回的整數的對象。我可以做這樣的事情:

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

但對於這裏面超過100枚舉設置一個枚舉似乎不是很實用。

那麼有沒有辦法做到這一點?再次,我的目標是簡單地插入一個int值並返回一個枚舉器,而無需爲此集合中的許多枚舉創建新方法。也許我應該把它做成自己的班級而不是普查員,但我希望這樣做。謝謝!

+0

退房的答案和意見在這裏:http://stackoverflow.com/questions/3943054/how-can-i-從值轉換爲枚舉 – Soronthar 2011-06-02 22:05:43

回答

9

枚舉有一個內置的身份證號碼,即可用於此目的的「序號」,只要您有一種簡單的方法即可從表示數據庫中給定值的號碼到枚舉的序號。按照它們在源文件中聲明的順序將枚舉值分配給枚舉值,從0開始,因此在您的示例中,SUNDAY的序號爲0,MONDAY爲1等。

爲了使用此值,您只需將存儲在數據庫中的整數轉換爲其對應的序號,然後將其用於access the enum value。因此,對於你的例子,如果根據自己的數據庫ID枚舉值的順序的實現可能是

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

是與它們在源代碼中聲明相同的順序,那麼你就可以非常簡單,只是使用上述方法原樣(除了更改類名稱)。否則,您可能需要做一些更復雜的事情來將數據庫值映射到序號;也許建立一個數組,如果映射是非常非線性的。

P.S.當然,如果你這樣做,那麼fId字段就沒有用處。

+0

語法錯誤:它的值(),而不是值。 – Bohemian 2011-06-02 22:15:40

+0

@Bohemian:你是什麼意思? – 2011-06-02 22:16:42

+0

values()是一個方法而不是字段。代碼需要是:return values()[i - 1]; (不返回值[i - 1];)。注意「值」後面的括號 – Bohemian 2011-06-03 00:33:06

1

編輯 - 緩存創建爲懶惰。

您可以創建Map<Integer,Day>運行時並將其用於getDay實現中。

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

    private static Map<Integer,Day> CACHE = null; 

    private static void lazyFillCache() { 
     if (CACHE != null) return; 

     final Map<Integer,Day> c = new HashMap<Integer,Day>(); 
     for (final Day d : Day.values()) { 
      c.put(d.fId, d); 
     } 

     CACHE = c; 
    } 

    public static Day getDay(int i) { 
     lazyFillCache(); 
     return CACHE.get(i); 
    } 

    public final int fId; 

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

編輯 - 湯姆Hawtins評論here的啓發,你也可以使用此實現,它利用了Java類加載功能:

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

    private static class Cache { 
     private static Map<Integer,Day> CACHE = new HashMap<Integer,Day>(); 

     static { 
      for (final Day d : Day.values()) { 
       CACHE.put(d.fId, d); 
      } 
     } 
    } 

    public static Day getDay(int i) { 
     return Cache.CACHE.get(i); 
    } 

    public final int fId; 

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

這不行!當類的靜態初始化器運行時,枚舉不可用 - 嘗試爲自己執行它。當代碼運行時,Day.values()是空的 – Bohemian 2011-06-02 22:14:46

+0

是的,我猜可能會發生,奇怪的是它在我的機器上工作。編譯器優化Mybe有些不可思議。然後我建議在getDay方法中初始化CACHE懶惰。 – bigoldbrute 2011-06-02 22:18:38

+0

看起來像我以前的實現實際上是可能的,發生緩存填充的靜態塊必須位於其他所有內容的末尾: http://stackoverflow.com/questions/536449/cannot-refer-to-the-static-enum-field -in-an-initializer – bigoldbrute 2011-06-02 22:34:03

0

Day.values()將返回(從零開始)的枚舉值數組。

5

你枚舉類應該有一個內置的查找映射作爲靜態變量。因此你的枚舉類應該是這樣的。

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; 
    } 


    private static final Map<Integer, Day > lookup 
    = new HashMap<Integer, Day >(); 

    static { 
    for (Day s : EnumSet.allOf(Day.class)) 
     lookup.put(s.getIntValue(), s); 
    } 

    public static Day getValue(int intValue) { 
     return lookup.get(intValue); 
    } 

} 

然後檢索基於一個int我正確的枚舉,你可以調用

Day.getValue(i); 

即使編號是非線性的或有間隙這種方法會奏效。

10

這裏有一個簡單的實現,將工作:

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 forInt(int id) { 
     for (Day day : values()) { 
      if (day.fId == id) { 
       return day; 
      } 
     } 
     throw new IllegalArgumentException("Invalid Day id: " + id); 
    } 
} 

如果你知道你的枚舉從1開始計數,你可以簡單地用這個來代替:

public static Day forInt(int id) { 
    return values()[id - 1]; 
} 
+0

@rmtheis OMG ...我不敢相信我編碼。謝謝。 – Bohemian 2016-09-19 05:21:12

0

日myDay = Day.values()[X] - x是int值