问题

如果实际业务中需要字典项,通常有以下几种做法

  • 数据库存对应的k,v
  • 数据库利用视图透视case when拿取结果
  • 代码中使用EnumMap
  • 代码中用枚举

其实就是分为了数据库和代码维护的方式,运行效率来说肯定是直接写到代码中更快,但维护起来就是数据库的优势了,所以说在数据不经常变动的情况下一般是存到代码中,反之存入数据库中。

使用枚举和常量类的区别

以下是代码对比

1
2
3
4
public class ObjectConstant {
/** 完成 */
public static final String FINISH = "FINISH";
}
1
2
3
4
public enum ObjectEnum {
/** 完成 */
FINISH;
}
  • 如果定义重复的值“FINISH”常量类并不会提示,可能会造成重复问题,枚举类编辑器会给出提示
  • enum相当于一个类,但不可被继承,表示对应的实例是有限的
  • 总结来说eunm做了很多限制更加规范

枚举的使用场景

  • 作为常量使用,比如星期一到星期日,通常配合switch使用
  • 通过增加变量和构造函数来达到灵活取值
  • 当字典项,数字或英文变量与所表示的值对应起来

使用枚举作为字典项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public enum ObjectTypeEnum {

/** GTA历史活动 */
GTA_HISTORY_ACTIVITY("GTA_HISTORY_ACTIVITY", "GTA历史活动"),
/** GTA活动追踪 */
GTA_ACTIVITY_TRACK("GTA_ACTIVITY_TRACK", "GTA活动追踪"),
/** 月报 */
OVERALL_DATA_ANALYSIS("OVERALL_DATA_ANALYSIS", "月报"),
/** 营销活动复盘 */
MARKETING_ACTIVITIES_ANALYSE("MARKETING_ACTIVITIES_ANALYSE", "营销活动复盘"),
/** 日报 */
DAILY("DAILY", "日报"),
/** 行为追踪 */
BEHAVIOR_TRACK("BEHAVIOR_TRACK", "行为追踪"),
/** 连带购买 */
JOINT_PURCHASE("JOINT_PURCHASE", "连带购买"),
/** 触点分析 */
CONTACT_ANALYSIS("CONTACT_ANALYSIS", "触点分析"),
/** 复购分析 */
REPURCHASE("REPURCHASE", "复购分析");

private final String typeKey;
private final String typeValue;

ObjectTypeEnum(String typeKey, String typeValue) {
this.typeKey = typeKey;
this.typeValue = typeValue;
}

public String getTypeKey() {
return typeKey;
}

public String getTypeValue() {
return typeValue;
}

public static String getValue(String typeKey){
for (ObjectTypeEnum type : values()){
if (Objects.equals(type.getTypeKey(), typeKey)){
return type.getTypeValue();
}
}
return null;
}

}