2017-04-11 209 views
0

我有多個狀態存儲在一個枚舉中。基於枚舉創建枚舉類別

public enum Status { 
    IS_A("isA"), 
    IS_B("isB"), 
    FP_ERR("fp_err"), 
    FP_BLAH("fp_blah"), 
    CORRECT("correct") 

    private final String value; 

    Status(String value) { 
     this.value = value; 
    } 
} 

我想不modifiying狀態枚舉類,以下面的方式來創建基於這些狀態類別。

public enum Category { 
    CategoryA("CategoryA",Status.IS_A, Status.IS_B), 
    CategoryB("CategoryB",Status.FP_ERR, Status.FP_BLAH). 
    CategoryC("CategoryC",Status.Correct); 

    private List<Status> status; 
    private String category; 

    private static final Map<Status, String> VALUE_MAP = Stream.of(Category.values()) 

    Category(String category, Status ... status) { 
     this.status = Arrays.asList(status); 
     this.category = category; 
    } 

    public static String getCategory(Status status) { 
     //Retrun category based on Status type 
     String category = VALUE_MAP.get(status); 
     return category; 
    } 
} 

我無法弄清楚如何每個類別的值存儲與他們在地圖上VALUE_MAP

回答

2

如果你改變你的初始化爲static塊,你可以這樣做:

private static final EnumMap<Status, String> VALUE_MAP = new EnumMap<>(Status.class); 
static { 
    Arrays.stream(Category.values()).forEach(category -> { 
     category.status.forEach(status -> { 
      VALUE_MAP.put(status, category.category); 
     }); 
    }); 
} 
+0

你應該使用'EnumMap'而不是'HashMap'。否則一個好建議。 –

+0

嘗試先找到沒有'forEach'的解決方案,例如'private static final Map VALUE_MAP = Arrays.stream(values())。collect(() - > new EnumMap <>(Status.class),(m,c) - > c.status.forEach s-> m.put(s,c.category)),Map :: putAll);' – Holger

2

狀態不需要VALUE_MAP可言。通過Status檢索category當你只需要經過所有Category.values(),並找到其中包含請求Status之一:

public static String getCategory(Status status) { 
    for (Category category : values()) { 
     if (category.status.contains(status)) { 
      return category.category; 
     } 
    } 
    return null; 
} 
+1

這比使用'Map'效率低。 –

+2

不,如果枚舉中只有3個值。 –

+0

效率差異很難說,如果'Map'是一個'HashMap',但無論出於何種原因,人們似乎總是忽略了'EnumMap'的存在,它被設計用來映射'enum'鍵值,因此肯定比嵌套循環更高效(記住'List'中的'contains'也是線性搜索)... – Holger